树的总结

【前言】树在计算机领域二等应用还是非常广泛的,比如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

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

 陈越老师有个图:

猜你喜欢

转载自www.cnblogs.com/huangfuyuan/p/9158993.html