二叉树遍历

 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

  (1)访问结点本身(N),

  (2)遍历该结点的左子树(L),

  (3)遍历该结点的右子树(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.中序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1)遍历左子树;

  (2)访问根结点;

  (3)遍历右子树。

  2.先序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1) 访问根结点;

  (2) 遍历左子树;

  (3) 遍历右子树。

  3.后序遍历得递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1)遍历左子树;

  (2)遍历右子树;

  (3)访问根结点。

  4.层次遍历

中序遍历的算法实现

  用二叉链表做为存储结构,中序遍历算法可描述为:

  void InOrder(BinTree T)

  { //算法里①~⑥是为了说明执行过程加入的标号

  ① if(T) { // 如果二叉树非空

  ② InOrder(T->lchild);

  ③ printf("%c",T->data); // 访问结点

  ④ InOrder(T->rchild);

  ⑤ }

  ⑥ } // InOrder 

遍历序列  

  1.遍历二叉树的执行踪迹

  三种递归遍历算法的搜索路线相同(如下图虚线所示)。

  具体线路为:

  从根结点出发,逆时针沿着二叉树外缘移动,对每个结点均途径三次,最后回到根结点。

  2.遍历序列

  A

  / /

  B C

  / / /

  D E F

  图

  (1) 中序序列(inorder traversal)

  中序遍历二叉树时,对结点的访问次序为中序序列

  【例】中序遍历上图所示的二叉树时,得到的中序序列为:

  D B A E C F

  (2) 先序序列(preorder traversal)

  先序遍历二叉树时,对结点的访问次序为先序序列

  【例】先序遍历上图所示的二叉树时,得到的先序序列为:

  A B D C E F

  (3) 后序序列(postorder traversal)

  后序遍历二叉树时,对结点的访问次序为后序序列

  【例】后序遍历上图所示的二叉树时,得到的后序序列为:

  D B E F C A

  (4)层次遍历(level traversal)二叉树的操作定义为:若二叉树为空,则退出,否则,按照树的结构,从根开始自上而下,自左而右访问每一个结点,从而实现对每一个结点的遍历。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值