给定中序和后序遍历,如何输出树的前序遍历?
给出当我在整数数组中具有先序和中序遍历时输出树的后序遍历的代码。如何使用给定的中序和后序数组来类似地获取前序?
void postorder( int preorder[], int prestart, int inorder[], int inostart, int length)
{
if(length==0) return; //terminating condition
int i;
for(i=inostart; i<inostart+length; i++)
if(preorder[prestart]==inorder[i])//break when found root in inorder array
break;
postorder(preorder, prestart+1, inorder, inostart, i-inostart);
postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);
cout<<preorder[prestart]<<" ";
}
这是 preorder() 的原型
void preorder( int inorderorder[], int inostart, int postorder[], int poststart, int length)
使用 postorder() 它将输出,
int preorder[6]={6,4,1,5,8,9};
int inorder[6]={1,4,5,6,8,9};
postorder( preorder,0,inorder,0,6);
下面是
1 5 4 9 8 6
print_preorder( 的错误代码),下面仍然无法工作
void print_preorder( int inorder[], int inostart, int postorder[], int poststart, int length)
{
if(length==0) return; //terminating condition
int i;
for(i=inostart; i<inostart+length; i++)
if(postorder[poststart+length-1]==inorder[i])
break;
cout<<postorder[poststart+length-1]<<" ";
print_preorder(inorder, inostart , postorder, poststart, i-inostart);
print_preorder(inorder, inostart+i-poststart+1, postorder, i+1, length-i+inostart-1);
}
Given the code for outputing the postorder traversal of a tree when I have the preorder and the inorder traversal in an integer array. How do I similarly get the preorder with the inorder and postorder array given?
void postorder( int preorder[], int prestart, int inorder[], int inostart, int length)
{
if(length==0) return; //terminating condition
int i;
for(i=inostart; i<inostart+length; i++)
if(preorder[prestart]==inorder[i])//break when found root in inorder array
break;
postorder(preorder, prestart+1, inorder, inostart, i-inostart);
postorder(preorder, prestart+i-inostart+1, inorder, i+1, length-i+inostart-1);
cout<<preorder[prestart]<<" ";
}
Here is the prototype for preorder()
void preorder( int inorderorder[], int inostart, int postorder[], int poststart, int length)
to use postorder() it will be
int preorder[6]={6,4,1,5,8,9};
int inorder[6]={1,4,5,6,8,9};
postorder( preorder,0,inorder,0,6);
out put will be
1 5 4 9 8 6
below is the incorrect code for print_preorder(), still not working below
void print_preorder( int inorder[], int inostart, int postorder[], int poststart, int length)
{
if(length==0) return; //terminating condition
int i;
for(i=inostart; i<inostart+length; i++)
if(postorder[poststart+length-1]==inorder[i])
break;
cout<<postorder[poststart+length-1]<<" ";
print_preorder(inorder, inostart , postorder, poststart, i-inostart);
print_preorder(inorder, inostart+i-poststart+1, postorder, i+1, length-i+inostart-1);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这里有一些提示:
postorder
子数组中的最后一个元素是新的preorder
根。inorder
数组可以在新preorder
根的两侧分成两部分。inorder
子数组上递归调用print_preorder
函数。print_preorder
函数时,inorder
和postorder
数组的大小将相同。postorder[poststart+length]
超出了数组末尾。要获取最后一个元素,您需要postorder[poststart+length-1]
print_preorder
函数选择了错误的长度。请记住,length
是子数组的长度,但inostart
是inorder
数组中的绝对位置。您的函数可能会以负长度
进行调用。画出这棵树可能会有所帮助:
然后写出三个遍历:
现在,放下电脑,拿出笔,然后写出三个遍历。纸并思考问题:)
想象一下这个调用堆栈(新的根打印在左侧):
祝你好运:)
Here's a few hints:
postorder
subarray is your newpreorder
root.inorder
array can be split in two on either side of the newpreorder
root.print_preorder
function on those twoinorder
subarrays.print_preorder
function, theinorder
andpostorder
arrays will be the same size.postorder[poststart+length]
is past the end of the array. To get the last element, you wantpostorder[poststart+length-1]
print_preorder
function chooses the wrong length. Remember thatlength
is the length of the subarray, butinostart
is the absolute position within theinorder
array. Your function will probably call with a negativelength
.It may help to draw the tree:
Then write out the three traversals:
Now, put down the computer, get out a pen & paper and think about the problem :)
Imagine this call stack (the new root is printed on the left):
Good luck :)
后序中的最后一个元素将是树的根。
之后,我们将查看 Inorder 数组以确定根的位置。数组的左侧是左子树,右侧是右子树。
通过使用该索引,我们将确定 left 中作为根的元素。
通过使用
我们对右子树也是如此,主要思想是通过查找中序数组来确定左子树和右子树的索引。希望我说清楚了..
这是我的作业。感谢@Stephen 的好回答
The last element in post order will be the root of the tree.
After that we will look in Inorder array to determine the position of the root. left side of the array is left sub tree and right side is right sub tree.
By using that index we shall determine the element in left which is the root.
similarly we do for the right sub tree, The main idea is we determine the indexes of left sub tree and right sub tree by looking in inorder array. hope i was clear..
This was hommework for me. Thanks to @Stephen for a good answer