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