目录
下一篇: 二叉树的层序遍历
二叉树的递归特性
1、要么是个空二叉树
2、要么就是由“根结点+左子树+右子树”组成的二叉树
先序遍历:根左右(NLR)
中序遍历:左根右(LNR)
后序遍历:左右根(LRN)
示例:
先序遍历:ABDECFG
中序遍历:DBEAFCG
后序遍历:DEBFCGA
练习1:
先序遍历:ABDGECF
中序遍历:DGBEAFC
后序遍历:GDEBFCA
最稳妥的方法:分支结点逐层展开法(过程)
先序遍历:
第一步(按根左右展开第一棵树A) | A | B | C |
|
|
|
|
第二步(按根左右展开子树B和C) | A | B | D | E | C | F |
|
第三步(最后展开D) | A | B | D | G | E | C | F |
中序遍历:
按左根右展开A | B | A | C |
|
|
|
|
按左根右展开B和C | D | B | E | A | F | C |
|
按左根右展开D | D | G | B | E | A | F | C |
后序遍历:
按左右根展开A | B | C | A |
|
|
|
|
按左右根展开B和C | D | E | B | F | C | A |
|
按左右根展开D | G | D | E | B | F | C | A |
练习2:
先序遍历:-+a*b-cd/ef 对应前缀表达式
中序遍历:a+b*c-d-e/f 中缀表达式(需要加界限符)
后序遍历:abcd-*+ef/- 后缀表达式
拟递归路过法求递归序列模
先序:当每个结点第一次被路过时访问
中序:当每个结点第二次被路过时访问
后序:当每个结点第三次被路过时访问
遍历的代码实现:
void visit(BiTree T){
printf("%d ",T->data);
}
先序遍历
void PreOrder(BiTree T){
if(T!=NULL){
visit(T);//访问根结点
PreOrder(T->lchild);//递归左子树
PreOrder(T->rchild);//递归右子树
}
}
中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);//递归遍历左子树
visit(T);
InOrder(T->rchild);//递归遍历右子树
}
}
后序遍历
void AftOrder(BiTree T){
if(T!=NULL){
AftOrder(T->lchild);//递归左子树
AftOrder(T->rchild);//递归右子树
visit(T);
}
}
//空间复杂度O(h)
//求树的深度
int treeDepth(BiTree T){
if(T==NULL){
return 0;
}else{
//递归求左子树高度
int l=treeDepth(T->lchild);
int r=treeDepth(T->rchild);
return l>r ? l+1 : r+1;
}
}
小结: