二叉树的先中后序遍历

目录

二叉树的递归特性

练习1:

最稳妥的方法:分支结点逐层展开法(过程)

先序遍历:

中序遍历:

后序遍历:

练习2:

拟递归路过法求递归序列模

遍历的代码实现:

先序遍历

中序遍历

后序遍历

//求树的深度

小结:

下一篇: 二叉树的层序遍历


二叉树的递归特性

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;

}

}

 

 

小结:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值