二叉树的遍历(前序、中序、后序、已知前中序求后序、已知中后序求前序)
AI研习图书馆,发现不一样的精彩世界
结构
二叉树的遍历
一、简介
二叉树的深度优先遍历(DFS)可细分为前序遍历、中序遍历、后序遍历,这三种遍历可以用递归方法实现(本篇随笔主要分析递归实现),也可使用非递归方法实现。
前序遍历:根节点->左子树->右子树(根->左->右)
中序遍历:左子树->根节点->右子树(左->根->右)
后序遍历:左子树->右子树->根节点(左->右->根)
1. 前序遍历
/* 以递归方式 前序遍历二叉树 */
void PreOrderTraverse(BiTree t, int level)
{
if (t == NULL)
{
return ;
}
printf("data = %c level = %d\n ", t->data, level);
PreOrderTraverse(t->lchild, level + 1);
PreOrderTraverse(t->rchild, level + 1);
}
2. 中序遍历
/* 以递归方式 中序遍历二叉树 */
void PreOrderTraverse(BiTree t, int level)
{
if (t == NULL)
{
return ;
}
PreOrderTraverse(t->lchild, level + 1);
printf("data = %c level = %d\n ", t->data, level);
PreOrderTraverse(t->rchild, level + 1);
}
3. 后序遍历
/* 以递归方式 后序遍历二叉树 */
void PreOrderTraverse(BiTree t, int level)
{
if (t == NULL)
{
return ;
}
PreOrderTraverse(t->lchild, level + 1);
PreOrderTraverse(t->rchild, level + 1);
printf("data = %c level = %d\n ", t->data, level);
}
printf("data = %c level = %d\n ", t->data, level);
二、案例解析
1. 前序遍历
前序遍历特点:根节点->左子树->右子树
注意看前序遍历的代码,printf语句是放在两条递归语句之前的,所以先访问根节点G,打印G,然后访问左子树D,此时左子树D又作为根节点,打印D,再访问D的左子树A。
前序遍历步骤
第一步:打印该节点
第二步:访问左子树,返回到第一步
第三步:访问右子树,返回到第一步
第四步:结束递归,返回到上一个节点
前序遍历的另一种表述:
(1)访问根节点
(2)前序遍历左子树
(3)前序遍历右子树
(在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成)
2. 中序遍历
中序遍历步骤:
第一步:访问该节点左子树
第二步:若该节点有左子树,则返回第一步,否则打印该节点
第三步:若该节点有右子树,则返回第一步,否则结束递归并返回上一节点
中序遍历的另一种表述:
(1)中序遍历左子树
(2)访问根节点
(3)中序遍历右子树
(在完成第1,3步的时候,要按照中序遍历的规则来完成)
3. 后序遍历
第一步:访问左子树
第二步:若该节点有左子树,返回第一步
第三步:若该节点有右子树,返回第一步,否则打印该节点并返回上一节点
后序遍历的另一种表述:
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根节点
(在完成1,2步的时候,依然要按照后序遍历的规则来完成)
三、重构二叉树
进入正题,已知两种遍历结果求另一种遍历结果,其实就是重构二叉树。
前序遍历:ABCDEF
中序遍历:CBDAEF
1、前序遍历的第一元素是整个二叉树的根节点
2、中序遍历中根节点的左边的元素是左子树,根节点右边的元素是右子树
3、后序遍历的最后一个元素是整个二叉树的根节点
用上面这些特点来分析遍历结果:
第一步:先看前序遍历,确定根节点为A
第三步:先来分析左子树CBD,那么CBD谁来做A的左子树呢?这个时候不能直接用中序遍历的特点(左->根->右)得出左子树应该是这个样子。
第四步:再观察中序遍历CBDAEF,B左边是C右边是D,说明B节点既有左子树又有右子树,左右子树只有一个元素就可以直接确定了,不用再返回去观察前序遍历
第五步:到这里左子树的重建就已经完成了,现在重建右子树。观察中序遍历右子树为EF,再观察前序遍历ABCDEF中右子树的顺序为EF,所以E为A的右子树,再观察中序便利中E只有右边有F,所有F为E的右子树,最后得到的二叉树是这个样子的。
第二种:已知中序遍历、后序遍历求前序遍历
中序遍历:CBDAEF
后序遍历为:CDBFEA
如上图所示,这两种二叉树前序(BEFA)和后序(AFEB)一样,但对应的中序遍历结果却不一样(左边是AFEB,右边是BEFA),所以仅靠前序和后序无法重构出唯一的二叉树。
综上所述,今天主要讲解了二叉树的遍历及重构二叉树,相信聪明的你已经学会了!
更多数据结构精彩分享,敬请期待!
关注AI研习图书馆,发现不一样的精彩世界