二叉树的前中后序你真的懂了吗
首先观察前中后序的排列方式
前中后序列的左右子树的顺序是不会改变的
唯一会改变的就是根节点的位置
ok
回到前中后
前序就是根节点在前面(根左右)
中序就是根节点在中间(左根右)
后序就是根节点在末端(左右根)
例如给一个二叉树
观察这个二叉树
我们使用前序遍历
根据我们刚才的根左右的顺序来解答这个二叉树
从左到右我们分别命上编号
A
BC
DEF
观察第一个根节点
就是我们的首结点
根左右的顺序来看这个二叉树下面的部分我们先不看
只看上面前两层
根据前序根左右我们可以得到ABC
但是我们的B结点在他的子数里面又是一个根节点,所以这个地方我们再把B展开
B根据根结点的排序我们可以得到一个新的就是
根左(根左右BDE)右
即为我们将B替换为BDE
现在我们的前序序列为A*BDE*C
继续展开我们的右边的树
即为C展开为CF根左右没有左结点 使用我们的C变成CF序列
现在我们的所有结点全部排序完毕
我们得到了全部的结点为
ABDECF
他们的遍历代码类似
我们可以简洁的清晰记忆
此处我们用C语言描述一下
稍等补上
用递归遍历
void PreOrder(BiTree T)
{
if(T!=Null)
{
visit(T); //访问根节点,这一行的位置不一样就是对应的遍历 不一样,看下一行PreOrder访问的是lchild也就是说如果我们的左节点不为空的话,会调用自己这个函数来访问左节点,函数的参数就是T ,对应着我们的理解就是把左子点当成根节点。符合了我们的遍历思想。
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
这个树的中序遍历也就是左根右的顺序
同理我们进行一下遍历
可能会对这个遍历带入一下就得到了
DBE
没错你得到了左子树得全部结点
继续带入(DBE)A(C)发现还少一个结点
我们把C的子树当成一个新的子树
空CF
是不是得到了一个右边得结点
串联起来就是
DBEACF
后序遍历为
左右根
DEBFCA
看一下下一篇关于这三种遍历的拓展到B树,我感觉你应该对遍历会有一个新的认识。看一看吧,,,,,,,,,,,,,那一篇能解决大部分的前中后序遍历。
链接: B树拓展.