【问题标题】:Construct a binary tree such that the Post-order traversal should give the sorted result构造一棵二叉树,使得后序遍历应该给出排序后的结果
【发布时间】:2010-02-07 13:23:20
【问题描述】:

我知道二叉搜索树上的按顺序遍历(访问左,访问根,访问右)会给我一个排序的结果。但我需要在二叉树上进行后序遍历(访问左、访问右、访问根),结果应该给我排序值。

为了实现这一点,我应该如何构建我的二叉树?

【问题讨论】:

    标签: algorithm data-structures binary-tree binary-search


    【解决方案1】:

    由于根是最后访问的,它必须包含最大的项目。由于左子树在右子树之前被访问,因此左子树中的所有项都必须小于右子树中的任何项。

    因此,要构造这样的树,您可以按以下步骤进行:如果插入大于根的项,则该项将成为新的根。如果插入一个小于根但大于左子树根的项,则将其插入右子树。否则将其插入左子树。

    【讨论】:

    • 这行得通,但不一定会产生平衡树 - 需要某种平衡算法。
    【解决方案2】:

    您需要在树的每个节点上确保以下内容:

    • 节点的值应该更大 比中的所有值 左子树和右子树。
    • 左子树中的值应该是 小于右边的值 子树。

    【讨论】:

      【解决方案3】:

      这个子程序用于在树中插入 其中树结构是

      struct tree
      
      {
      
      int data;
      tree * left;
      tree *right;
      
      tree(int n)  // constructor 
      
      {
             data = n;
             left = right = NULL;
          }
      };
      

      算法是:
      1. 如果树为空,则插入新节点。
      2.如果新节点的数据大于根节点的数据,则创建新节点
      树的根。
      3. else 在树的左子树中插入新节点。

      tree * insert(tree *root,int n)
      
      {
      
      if(root == NULL)
      {
      
          root = new tree(n);
      
          return root;
      }
      else
      {
      
          if(n > root -> data)
          {
              tree * t = new tree(n);
      
              t -> left = root;
      
              return t;
          }
      
          else
      
      
          {
      
              root -> left = insert(root -> left,n);
      
              return root;
          }
          }
      }
      

      【讨论】:

        【解决方案4】:

        currently accepted answer 提供了一个很好的在线算法。一个更简单的解决方案——不在线,因此可能作弊——是在父指针中存储一个排序的链表。

        换句话说:对数据进行排序;将最大的项放在根中,使其其中一个子树为空,然后将剩余 n-1 个项的后序排序树递归构造到另一个子树中。

        树的高度为 n,单叶是列表的头部,根是最尾部的元素。如果您从叶子到根遍历树,则元素将形成一个递增序列,并且该路径将完全对应于后序遍历。

        【讨论】:

          【解决方案5】:

          删除

          • 如果是叶子,则定期删除
          • 如果只有一个儿子,则将儿子与父亲联系起来
          • 否则,删除根,用它的右儿子替换它,然后将左子树连接到右子树中最左边的顶点。

          例如:

              7                                                            6
             / \                                                          / \
            3   6             =========DELETING 7 ============>          4   5
           / \ / \                                                      /    
          1  2 4  5                                                    3
                                                                      / \
                                                                     1   2
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-12-30
            • 1970-01-01
            • 2022-06-27
            • 2013-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多