给出当我在整数数组中具有前序和中序遍历时输出树的后序遍历的代码。如何使用给定的中序和后序数组类似地获得前序?

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() 的原型(prototype)

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);
    }

最佳答案

这里有一些提示:

  • postorder 子数组中的最后一个元素是新的 preorder 根。
  • inorder 数组可以在新 preorder 根的任一侧分成两部分。
  • 您可以在这两个 print_preorder 子数组上递归调用 inorder 函数。
  • 调用 print_preorder 函数时,inorderpostorder 数组的大小相同。
  • 你有一个越界的数组访问:postorder[poststart+length] 超出了数组的末尾。要获取最后一个元素,您需要 postorder[poststart+length-1]
  • 您的第一个递归 print_preorder 函数选择了错误的长度。请记住,length 是子数组的长度,而 inostartinorder 数组中的绝对位置。您的函数可能会以负值 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};
    

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

    想象一下这个调用堆栈(新的根打印在左边):
    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=[])
    

    祝你好运 :)

    关于c++ - 给定中序和后序遍历,如何输出树的前序遍历?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3002234/

    10-11 17:06