首页 > 编程知识 正文

二叉树的先序,中序,后序遍历怎么看,中序遍历一棵二叉排序树可以得到

时间:2023-05-05 23:10:32 阅读:171601 作者:87

有个问题。 已知二叉树的前相横移和中相横移。

PreOrder: GDAFEMHZ

InOrder: ADEFGHMZ

怎么复原这个二叉树,求他后手的扫描呢?

我们基于这样的事实,即中序遍历一定是{左部分树的节点集合},root,{右部分树的节点集合},前序遍历的作用是找到各部分树的root的位置。

算法1

输入:上一个导线测量,中导线测量

1、寻找树的根,走在最前面的第一节点g是根。

2、在观察之前遍历GDAFEMHZ,知道g是root,并且其馀的节点必然在root左边或者右边的子树中的节点上。

3、观察过程中依次遍历ADEFGHMZ。 这里,根节点g左侧的ADEF必须是根节点左侧的子树中的节点,g右侧的HMZ必须是根节点右侧的子树中的节点,这表明根节点的两个子树不是空的

4、观察左侧子树的ADEF,按扫描顺序对DAFE进行排序。 因此,左侧的子树的根节点是d,且a是左侧的子树的左侧的子树的节点,EF是左侧的子树的右侧的子树的节点。

5、同样,观察右部分树节点HMZ,前序为MHZ。 因此,右部分树的根节点是m,左部分树的节点h,右部分树的节点z。

观察表明,上面的过程是递归的。 找到当前树的根节点,将其分为左侧子树、右侧子树,然后进入左侧子树重复上述过程,进入右侧子树重复上述过程。 最后可以把树拿回来:

得到了PostOrder: AEFDHZMG

改进:

而且,实际上,如果只是写后续扫描的话,为了保存被复原的树就不要留出特别的空间。 只需将得到的后续顺序保存为一个数组,即可实现以下目的。

算法2

输入:保留最后顺序的数组、遍历上一顺序、遍历中顺序

1、确定路线,放在数组末尾

2、确定左子树的索引范围,并放置在数组中相同索引的位置。

3、确定右部分树的索引范围,放在数组中对应索引的位置,可以正好放下。

4、用左子木的前相横移和中相横移,将后相横移保存在相应的分度位置

5、左子木的前相横移和中相横移,将后相横移保存在相应的分度位置

引申问题

同样,可以通过中序遍历和后序遍历来恢复此树。

但是,之前和之后的导线测量找不到中间点,因此无法恢复此树。 请注意以下两种情况。

两棵树的前序相同,两棵树的后序也相同。 也就是说,如果有子树,且其根节点的一个子树是空树,则无法判断该子树是空树。

上算法1和算法2的代码:

//算法1 # include iostream # include fstream # includestringstructtreenode { struct treeenode * left; struct TreeNode* right; char elem; (; treenode * binarytreefromorderings (char * in order,char* preorder,int length ) { if } length==0} { return null; }TreeNode* node=new TreeNode; node-elem=*preorder; int rootIndex=0; for (; 根索引长度; rootindex(if ) inorder[rootindex]==*preorder ) break; } node-left=binarytreefromorderings (in order,preorder 1,rootIndex ); node-right=binarytreefromorderings (inorderrootindex 1,preorder rootIndex 1,length-) rootindex1); STD : cout node-elem STD :3360 endl; 删除节点; 返回空值; }intmain(intargc,char** argv ) { char* pr='GDAFEMHZ '; char* in='ADEFGHMZ '; binarytreefromorderings(in,pr,8; 打印((n ); 返回0; }

主题只要求输出后续的遍历,可以将当前节点的value直接保存在一个char中。

# include stdio.h # include stdio.h # includeiostreamusingnamespacestd; struct treenode { struct treenode * left; struct TreeNode* right; char elem; (; voidbinarytreefromorderings (char * in order,char* preorder,int length ) length==0) {//cout ' invalid length rength } char node_value=*preorder; int rootIndex=0; for (; 根索引长度; rootindex(if ) inorder[rootindex]==*preorder ) break; //leftbinarytreefromorderings (in order,preorder 1,rootIndex ); //rightbinarytreefromorderings (inorderrootindex 1,preorder rootIndex 1,length-) rootindex1); coutnode_valueendl; 返回; }intmain(intargc,char* argv[] ) printf ) ' Helloworld! n '; char* pr='GDAFEMHZ '; char* in='ADEFGHMZ '; binarytreefromorderings(in,pr,8; 打印((n ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。