树的基本概念与二叉树相关
基本概念:(双亲,兄弟,堂兄弟等不在这里赘述)
结点(node):包含一个数据元素及若干指向其子树的分支
结点的度(degree):结点拥有子树的个数
树的度:树中所有结点的度的最大值
叶子结点(leaf):度为0的结点
二叉树的性质:
1.在二叉树的第i层至多有2^(i-1)个结点
example
1
2 3
4 5 6 7
** 第2层有2^1
** 第3层有2^4
2.深度为k的二叉树至多有2^k-1个结点
example:
如上二叉树:深度为3 总共2^3-1=7个node
3.对于任意一个二叉树T,若终端结点为n0,度为2的结点数为n2,n0=n2+1;
example:
如上二叉树:终端结点4,度数为2的结点n2=3
**完全二叉树: 1.所有叶子结点只能出现在层号最大的两层上; 2.对任意节点,若其右子树的层高为k,左子树必为k或k+1;
4.具有n个结点的完全二叉树的深度为[log2(n)]+1
5.对于具有n个结点的完全二叉树,如果按照对满二叉树的方式进行顺序编号,对于任意序号为i的结点有:
1)i=1; 结点i为root,无parent;i>1则parent=i/2
2) 2i<=n; 结点i的左孩子结点序号为2i否则无左孩子
3)2i+1<=n;结点i的右孩子结点序号为2i+1否则无右孩子
二叉树的存储:
1.对于满二叉树以及完全二叉树的适合存储(顺序存储结构)
由性质5我们可以将标号为i的左孩子下标为2i,右孩子下标为2i+1,双亲的结点下标为[i/2];
二叉树的存储结构定义:
1 #define MAX 100 2 typedef struct{ 3 int Sqsitree[MAX+1]; //0号单元不用 4 int nodemax; //数组中最后一个节点的下标 5 }Bitree;
2.适用于所有二叉树的存储(链式存储结构)
我们可以如下定义:
_________________
|Lchild | Data |Rchild|
描述如下:
typedef struct node{ int data; struct node* Lchild; struct node* Rchild; }sitnode,*Sitree;
同样当我们需要父母时也可以加上parent,组成三叉链表
二叉树的遍历:
1.递归实现:
A、先序遍历:root->left->right
B、中序遍历:left->root->right
C、后序遍历:right->left->root
void FreOrder(Bitree root) { if(root) { Visit(root->data); FreOrder(root->Lchild); FreOrder(root->Rchild); } }
//中序遍历和后序遍历只是修改访问root数据的顺序
2.非递归实现
先序遍历的实现:
1)访问root,root入栈并进入其左子树,进而访问左子树的root并入栈,在进入下一层左子树,...直到为空
2)栈非空则从栈顶退出上一层的结点,并进入该节点的右子树
1 void PreOrder(Bitree root){ 2 Seqstack *s; 3 Bitree p; 4 InitStack(S); 5 p=root; 6 while(p!=NULL||!IsEmpty(s)) 7 { 8 while(p!=NULL) 9 { 10 Visit(p->data); 11 Push(S,p); 12 p=p->Lchild; 13 } 14 if(!IsEmpty(S)){ 15 Pop(S,p); 16 p=p->Rchild; 17 } 18 } 19 }
中序遍历只是调换了data的访问位置
后序遍历:
1.当前结点进栈,并进入其左子树,重复至当前结点为空;
2.若栈非空,判断栈顶结点P的右子树是否为空,右子树是否访问过,是则退栈
1 void PostOrder(Bitree root) 2 { 3 SeqStack *s; 4 Sitree p,q; 5 InitStack(s); 6 p=root; 7 q=NULL; 8 while(p!=NULL||!IsEmpty(S)) 9 { 10 while(p!=NULL); 11 { 12 push(s,p); 13 p=p->Lchild; 14 } 15 if(!IsEmpty(s)) 16 { 17 Top(s,&p); 18 if((p->Rchild==NULL)||(p->Rchild==q)) 19 { 20 Pop(s,p); 21 Visit(P->data); 22 q=p; 23 p=NULL; 24 } 25 else 26 p = p-> Rchild; 27 } 28 } 29 30 }
//以上是我用一小时对二叉树的复习,其中运用栈的地方,读者可以自行定义变化。
上面仅是博主的自己复习的内容,如果有用,感谢支持,如有不足,请大佬指正!

浙公网安备 33010602011771号