• 树的总结


    【前言】树在计算机领域二等应用还是非常广泛的,比如select端口复用和map()...等等容器底层都是用的一种二叉树---红黑树;一些数据库会用到非二叉树B树;当然一些排序算法也会用到,结合浙江大学陈越老师的公开课,现在总结一下。主要围绕树中的二叉树来讲

    一、基本知识

      1、定义略。

      2、常见二叉树

        (1)满二叉树:节点都是满的,除最后一层都是有两个子节点,最后一层也是满的;

        (2)完全二叉树:除最后一层都是满的,并且最后一层优先从左侧排数据;

        (3)平衡二叉树:(AVL)任一节点,左右子树差的绝对值不超过1;

      3、存储结构

      (1)顺序存储:顺序存储使用的是数组。但是数组会按照完全二叉树对节点进行编码,所以不是完全二叉树或者满二叉树,会造成存储空间的浪费。数据结构里的堆是一种完全二叉树,使用数组存储! 

                                                                                      

       对于上图,它的存储编号是这样的:A(1)B(2)C(3)D(4)E(5)F(6)G(7),以层序遍历,下标是在数组中的存储位置。二叉树顺序存储的存、取数据代码:   (适用明确告诉你是数组存储的,一般还是写链表存储的)

     1 #include <stdio.h>
     2 void get_tree(char*,int);
     3 void print_tree(char*,int);
     4 //
     5 void get_tree(char *tree,int sub){
     6     char t;
     7     scanf("%c",&t);
     8     tree[sub]=t;
     9     if(t=='#')
    10         return;
    11     get_tree(tree,2*sub);
    12     get_tree(tree,2*sub+1);
    13 }
    14 //
    15 void print_tree(char *tree,int sub){
    16     if(tree[sub]=='#')
    17         return;
    18     printf("%c",tree[sub]);
    19     print_tree(tree,2*sub);
    20     print_tree(tree,2*sub+1);
    21 }
    23 int main(){
    24     char tree[1000];
    25     get_tree(tree,1);
    26     print_tree(tree,1);
    27     return 0;
    28}

      (2)链式存储:其节点数据结构

    typedef struct node
    {
          char data;
          struct node *lchild,*rchild;  
    }BinTree;

        先序遍历,后序遍历,中序遍历代码:https://www.cnblogs.com/SHERO-Vae/p/5800363.html

       总结:先序遍历和中序遍历,无论递归算法还是非递归算法都只是在调整输出的顺序。通过一个栈可以控制第一次还是第二次访问元素,但是不好实现第三次,所以需要一个额外的临时栈。

     陈越老师有个图:

     可以看成每个节点都有三个分支左上角120度算第一次,下面120度算第二次,右上算第三次。

  • 相关阅读:
    2017年系统架构设计师论文范文
    在SQL Server 2008中执行透明数据加密(转自IT专家网)
    开发笔记
    [置顶] GO-Gin框架快速指南
    [置顶] JS-逆向爬虫
    [置顶] ES篇
    [置顶] GO
    [置顶] 爬虫入狱指南
    [置顶] websocket
    [置顶] Linux篇
  • 原文地址:https://www.cnblogs.com/huangfuyuan/p/9158993.html
Copyright © 2020-2023  润新知