由中序遍历和后序遍历推导出中序遍历

133 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

1、由中序遍历和后序遍历推导出中序遍历

已知一棵二叉树的中序序列和后序序列分别为c,b,a,e,d,h,g,j,i,f和  c,b,e,h,j,i,g,f,d,a ,画出这棵二叉树,并写出其先序遍历序列 ,然后画出其先序线索化后的二叉链表。

画出来如下图所示: image.png

所以先序遍历的结果为:a->b->c->d->e->f->g->h->i->j

2、推导过程

中序遍历为:c,b,a,e,d,h,g,j,i,f后序遍历为:c,b,e,h,j,i,g,f,d,a先看后序遍历,因为后序遍历的最后一个是a,整棵树的根节点。再看中序,中序遍历中c,b在a的前面所以c,b构成了a 的左子树。那么我们就只看c,b。因为c,b构成了一棵树,同样的思路先看后序遍历再看先序遍历。这棵子树的的中序遍历是c、b,后序遍历是c、b。那么就会发现后序遍历中b在会后,所以b是这个子树的根节点。再看中序遍历,因为c在b的前面所以c为左孩子。 同理我们忽略cba之后再看根节点a的右子树:这棵子树的先序遍历是:e、d、h、g、j、i、f;后序遍历是:e、h、j、i、g、f、d。会发现d为后序遍历的最后一位,那么d就是这棵子树的根节点,中序遍历中只有e在d前面,所以e为d的左孩子。再忽略e、d之后。后序遍历中最后一位是f,说明f是d右子树的根节点。而f在中序遍历中也是最后一个说明f没有右孩子。剩下的h、g、j、i 构成了f的左子树。在后序遍历中g在最后一位,说明g是这棵子树的根节点。在中序遍历中只有h在g的前面,说明h为g的左孩子。再忽略fgh。仅剩i、j,后序遍历中i在最后所以i为g的右孩子,又因为在中序遍历中j在i的前面,所以j是i的左孩子。至此整棵树还原完毕!

整体思路就是先看后序遍历,后序遍历的最后一位就是根节点设为x!然后再看先序遍历,先序遍历中x前面的构成了x的左子树,x后面的构成了x的右子树。既然都是树,那么就可以用同样的方法去还原出这棵树。

3、验证

先序创建一个二叉树,然后打印三种遍历的结果和题设一样即可!!!

image.png