二叉树遍历方式
来源:互联网 发布:淘宝购物返利模式 编辑:程序博客网 时间:2024/06/06 06:59
遍历方案
二叉树的前序遍历
个操作:
⑴访问结点本身(N),
⑵遍历该结点的左子树(L),
⑶遍历该结点的右子树(R)。
以上三种操作有六种执行次序:
NLR、LNR、LRN、NRL、RNL、RLN。
注意:
前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。
遍历命名
根据访问结点操作发生位置命名:
① NLR:前序遍历(PreorderTraversal亦称(先序遍历))
——访问根结点的操作发生在遍历其左右子树之前。
② LNR:中序遍历(InorderTraversal)
——访问根结点的操作发生在遍历其左右子树之中(间)。
③ LRN:后序遍历(PostorderTraversal)
——访问根结点的操作发生在遍历其左右子树之后。
注意:
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。
遍历算法
1.中序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵访问根结点;
⑶遍历右子树。
2.先序遍历的递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴ 访问根结点;
⑵ 遍历左子树;
⑶ 遍历右子树。
3.后序遍历得递归算法定义:
若二叉树非空,则依次执行如下操作:
⑴遍历左子树;
⑵遍历右子树;
⑶访问根结点。
4.层次遍历
中序算法实现
用二叉链表做为存储结构,中序遍历算法可描述为:
void InOrder(BinTree T)
{ //算法里①~⑥是为了说明执行过程加入的标号
① if(T) { // 如果二叉树非空
② InOrder(T->lchild);
③ printf("%c",T->data); // 访问结点
④ InOrder(T->rchild);
⑤ }
⑥ } // InOrder
中序投影法
计算中序遍历拥有比较简单直观的投影法,如图
中序遍历的投影法
遍历序列
1.遍历二叉树的执行踪迹
三种递归遍历算法的搜索路线相同(如下图虚线所示)。
具体线路为:
从根结点出发,逆时针沿着二叉树外缘移动,对每个结点均途径三次,最后回到根结点。
2.遍历序列
图
⑴ 中序序列(inorder traversal)
中序遍历二叉树时,对结点的访问次序为中序序列
【例】中序遍历上图所示的二叉树时,得到的中序序列为:
D B A E C F
⑵ 先序序列(preorder traversal)
先序遍历二叉树时,对结点的访问次序为先序序列
【例】先序遍历上图所示的二叉树时,得到的先序序列为:
A B D C E F
⑶ 后序序列(postorder traversal)
后序遍历二叉树时,对结点的访问次序为后序序列
【例】后序遍历上图所示的二叉树时,得到的后序序列为:
D B E F C A
⑷层序遍历(level traversal)二叉树的操作定义为:若二叉树为空,则退出,否则,按照树的结构,从根开始自上而下,自左而右访问每一个结点,从而实现对每一个结点的遍历
【例】层序遍历上图所示的二叉树时,得到的层序序列为:
A B C D E F
层序遍历
除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
编辑本段递归实现
在这里,所有的二叉树都以数组的形式储存。
前序遍历
procedure first(i:longint);
begin
write(a[i]);
if a[i*2]<>0 then first(i*2);
if a[i*2+1]<>0 then first(i*2+1);
end;
中序遍历
procedure mid(i:longint);
begin
if a[i*2]<>0 then mid(i*2);
write(a[i]);
if a[i*2+1]<>0 then mid(i*2+1);
end;
后序遍历
procedure last(i:longint);
begin
if a[i*2]<>0 then last(i*2);
if a[i*2+1]<>0 then last(i*2+1);
write(a[i]);
end;
- 二叉树遍历方式
- 二叉树遍历方式
- 二叉树的遍历方式
- 二叉树遍历方式总结
- 二叉树的遍历方式
- 二叉树的三种遍历方式
- 二叉树的创建及遍历方式
- 二叉树及其遍历方式(java)
- 二叉树的三种非递归遍历方式。
- 二叉树3种遍历方式
- 二叉树的3种遍历方式
- 二叉树的几种遍历方式
- 二叉树遍历的各种方式
- 二叉树的多种遍历方式
- 二叉树各种遍历方式实现
- 二叉树的三种遍历方式
- 二叉树的遍历有三种方式
- 二叉树中的三种遍历方式
- 使用NDK编译时出现cannot execute binary file的问题
- Oracle密码复杂度设置(Oracle_Password_Complexity)
- 设计模式之---职责链模式(一)
- Eclipse远程调试Tomcat
- 游戏系统之我见
- 二叉树遍历方式
- Python MySQLdb 学习总结
- 关于spec cpu2000的编译问题.
- BaseAdapter 中getItem 的用途
- 杭电1587
- C# 不加web引用,动态调用webservice
- 关于Opencv2.4.x中stitcher类的简单应用
- IMP命令参数知多少
- Linux 下 C 网络编程之 多线程通信 实例