在给定顺序和后序遍历的情况下,如何输出树的前序遍历?

use*_*580 3 c++ recursion tree-traversal data-structures

给出了在我有预订顺序和整数数组中的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]<<" ";
}
Run Code Online (Sandbox Code Playgroud)

这是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);
Run Code Online (Sandbox Code Playgroud)

out put将是

1 5 4 9 8 6
Run Code Online (Sandbox Code Playgroud)

下面是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);
    }
Run Code Online (Sandbox Code Playgroud)

Ste*_*hen 9

这里有一些提示:

  • postorder子阵列中的最后一个元素是您的新preorder根.
  • inorder阵列可以在两个上的新的任一侧被分割preorder根.
  • 您可以print_preorder在这两inorder个子数组上以递归方式调用函数.
  • 调用print_preorder函数时,inorderpostorder数组的大小相同.
  • 您有一个越界数组访问:postorder[poststart+length]超过数组的末尾.要获得最后一个元素,您需要postorder[poststart+length-1]
  • 您的第一个递归print_preorder函数选择了错误的长度.请记住,这length是子阵列的长度,但是inostart是阵列中的绝对位置inorder.您的函数可能会以负数调用length.
  • 你的第二个递归函数对于转换边界和长度来说相当遥远.它可能有助于在纸上绘制并跟踪您的算法.

绘制树可能有所帮助:

     6
   /   \
  4     8
 / \     \
1   5     9
Run Code Online (Sandbox Code Playgroud)

然后写出三个遍历:

// 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};
Run Code Online (Sandbox Code Playgroud)

现在,放下电脑,拿出笔和纸,思考问题:)

想象一下这个调用堆栈(新的根目录打印在左侧):

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=[])
Run Code Online (Sandbox Code Playgroud)

祝好运 :)