给定用于输出树的后序遍历的代码,当我在整数数组中有预订顺序和inorder遍历时。我如何同样获得带有inorder和postorder数组的预订单?
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);
out put将是
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);
}
答案 0 :(得分:9)
以下是一些提示:
postorder
子阵列中的最后一个元素是您的新preorder
根。inorder
数组可以在新preorder
根的任意一侧拆分为两个。print_preorder
子阵列上以递归方式调用inorder
函数。print_preorder
函数时,inorder
和postorder
数组的大小相同。postorder[poststart+length]
超出了数组的末尾。要获取最后一个元素,您需要postorder[poststart+length-1]
print_preorder
函数选择了错误的长度。请记住,length
是子数组的长度,但inostart
是inorder
数组中的绝对位置。您的函数可能会使用否定length
来调用。绘制树可能会有所帮助:
6
/ \
4 8
/ \ \
1 5 9
然后写出三个遍历:
// index: 0 1 2 3 4 5
int postorder[6]={1,5,4,9,8,6};
int inorder[6]= {1,4,5,6,8,9};
int preorder[6]= {6,4,1,5,8,9};
现在,放下电脑,拿出一支笔&amp;论文和思考关于这个问题:)
想象一下这个调用堆栈(新的根目录打印在左侧):
6 print_preorder(len=6, in=[1 4 5 6 8 9], post=[1 5 4 9 8 6])
4 |-> print_preorder(len=3, in=[1 4 5], post=[1 5 4])
1 | |-> print_preorder(len=1, in=[1], post=[1])
| | |-> print_preorder(len=0, in=[], post=[])
| | |-> print_preorder(len=0, in=[], post=[])
5 | |-> print_preorder(len=1, in=[5], post=[5])
| |-> print_preorder(len=0, in=[], post=[])
| |-> print_preorder(len=0, in=[], post=[])
8 |-> print_preorder(len=2, in=[8 9], post=[9 8])
|-> print_preorder(len=0, in=[], post=[])
9 |-> print_preorder(len=1, in=[9], post=[9])
|-> print_preorder(len=0, in=[], post=[])
|-> print_preorder(len=0, in=[], post=[])
祝你好运:)
答案 1 :(得分:4)
发布顺序中的最后一个元素将是树的根。
之后我们将查看Inorder数组以确定根的位置。数组的左侧是左子树,右侧是右子树。
通过使用该索引,我们将确定左侧的元素是根。
同样我们为右子树做,主要思想是通过查看inorder数组来确定左子树和右子树的索引。希望我很清楚..
public static void printpreorder(char []inorder,int i_start,int i_end,char[] postorder,int p_start,int p_end)
{
if(i_start > i_end || p_start > p_end)
return ;
char root = postorder[p_end];
System.out.print(root);
System.out.print("(");
int k=0;
for(int i=0; i< inorder.length; i++){
if(inorder[i]==root){
k = i;
break;
}
}
printpreorder(inorder, i_start, k-1, postorder, p_start, p_start+k-(i_start+1));
System.out.print(")(");
printpreorder(inorder, k+1, i_end, postorder, p_start+k-i_start, p_end-1);
System.out.print(")");
}
这对我来说很好。感谢@Stephen给出了一个很好的答案