遍历二叉树

概述:我们把图形的方式来表现树的结构,
对于我们来说是非常直观的,
但是对于计算机来说,它只有循环,
判断等方法来处理,也就是说它只会处理线性的序列,
而我们讲的二叉树的遍历就是把树中的结点变成某种意义上的线性序列。


定义:二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次。
在这里插入图片描述
注意:每个结点仅被访问一次。


遍历方式(4种)
在这里插入图片描述
(1)前序遍历(根左右)

在这里插入图片描述
在这里插入图片描述
说明:根据口诀,首先是根(A),然后是左子树(即结点A的左子树BDFE),然后到右子树(结点A的右子树,即CGIH),注意,这里遍历到左子树的时候,B结点同样成为根节点,然后到结点B的左子树(D),然后到结点B的右子树(F,这里F有称为根节点,E是结点F的左子树)。其实这就是一个递归的过程。

代码实现:(由于二叉树的定义本身就是一个递归的过程,所以代码的原理就是一个递归的过程)

void PreOrderTraverse(BiTree* T)
{
   if(T==NULL)
   return;
   printf("%c",T->data);//输出结点的数据
   PreOrderTraverse(T->lchild);//遍历左子树
   PreOrderTraverse(T->rchild);//遍历右子树
}

前序遍历结果为:ABDFECGHI

(2)中序遍历(左根右)
在这里插入图片描述
在这里插入图片描述
说明:这里D结点没有左子树和右子树,为了更直观的看到遍历结果,我们可以假想它有左子树和右子树。这样,可以在最终的遍历结果时去掉假想有的结点就可以了。

//代码实现(中序遍历算法)

void PreOrderTraverse(BiTree* T)
{
   if(T==NULL)
   return;
   PreOrderTraverse(T->lchild);//遍历左子树
   printf("%c",T->data);//输出结点的数据
   PreOrderTraverse(T->rchild);//遍历右子树
}

中序遍历结果为:DBEFAGHCI

(3)后序遍历(左右根)
在这里插入图片描述
在这里插入图片描述
说明:这里也一样,在遇到难以判断遍历顺序的二叉树时,为了更直观的看到遍历结果,我们可以假想所有结点都有左子树和右子树。这样,可以在最终的遍历结果时去掉假想有的结点就可以了。

//代码实现(后序遍历算法)

void PreOrderTraverse(BiTree* T)
{
   if(T==NULL)
   return;
   PreOrderTraverse(T->lchild);//遍历左子树
   PreOrderTraverse(T->rchild);//遍历右子树
   printf("%c",T->data);//输出结点的数据
}

后序遍历结果:DEFBHGICA

(4)层序遍历
层序遍历就比较简单了,简单来说就是一层一层来遍历。从左到右,从上到下。

层序遍历结果:ABCDFGIEH
在这里插入图片描述

二叉树遍历的性质:
(1)已知二叉树的前序遍历和中序遍历,可以唯一确定一颗二叉树。
(2)已知二叉树的后序遍历和中序遍历,可以唯一确定一颗二叉树。
(3)已知二叉树的前序遍历和后序遍历,不能唯一确定一颗二叉树。
(这里,大家可以举一个具有3个结点的二叉树进行自行推导)
参考:https://www.cnblogs.com/du001011/p/11229170.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值