【问题标题】:In a perfectly balanced binary tree convert from preorder to inorder在完美平衡的二叉树中,从前序转换为中序
【发布时间】:2020-01-02 03:45:08
【问题描述】:

所以我有一个完美平衡的(每个节点有两个子节点,如果没有子节点就是叶子节点)二叉搜索树

                  1
          2                  9
       3      6         10       11
     4   5  7   8    12   13  14    15 

我在一个数组中预购了它

[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]

现在如何将我的数组转换为有序或后序?

【问题讨论】:

    标签: arrays binary-tree inorder preorder


    【解决方案1】:

    嗯,不知何故,昨天我误解了你的问题,或者你没有很好地解释它。不管怎样,问题是——

    你有一个包含树节点的数组,放置在 树的前序遍历;现在你想“逆向工程” 这样您就可以从该数组中再次构建或制作一棵树,以便您可以遍历 IN 或 POST 顺序,无论您需要做什么!

    现在你需要了解一件事,当你从树中创建数组时,你的数组应该包含有值的节点,以及没有值的节点。换句话说,您必须将树的空节点放置在数组中,这样您就可以区分具有值的节点和没有值的节点!!很简单!

    所以,你需要做的是,在遍历树时,你应该遵循这两个步骤——

    1. 如果节点有值,则放入数组中

    2. 否则将-1放入数组[-1表示空值]

    现在,在遍历树并从该树生成数组之后,您可以对数组进行解码以从数组中构造回树。

    从树中创建数组的过程

    1. 执行级别顺序遍历
    2. 如果根有值,则将其放入数组中
    3. 否则,将 -1 放入数组中
    4. 重复,直到所有节点都被遍历

    伪码

    FUNCTION encode(TREE root, Array a){
      Queue q;
      q->add(root);
      i = 0;
      a[i++] = root->node;
    
      while(!q){
         TREE temp = q->front();
         q->pop();
    
         /* if temp's left node contains value */
         if(temp->left){
              a[i++] = temp->left->node;
              q->push(temp->left);
         }else{
           /*  if temp's left node doesn't contains value */
              a[i++] = -1;
         }
    
         /* do the same for right sub-tree */
         if(temp->right){
              a[i++] = temp->right->node;
              q->push(temp->right);
         }else{
           /*  if temp's left node doesn't contains value */
              a[i++] = -1;
         }
      }
       return a;
    }
    

    现在您可以反转算法以从数组中构造一棵树,然后您可以执行 POST 或 IN 任何您需要的操作!

    从数组制作树的过程

    1. 创建根

      1.1 将根放入队列

    2. 从数组遍历第 I 个索引

      2.1 IF ARRAY[INDEX] != -1 ,在左侧创建节点

      2.2 ELSE PUT NULL ON LEFT

    3. 从数组遍历 I+1-TH 索引

      3.1 IF ARRAY[INDEX] != -1 ,在右侧创建节点

      3.2 ELSE PUT NULL ON RIGHT

    4. 继续直到队列变为空

    伪码

    FUNCTION decode(Array a){
        /* creating root */
        TREE root;
        IF (a[0] == -1) 
             root = createNode(a[0]);
        ELSE
            root = NULL;
    
        Queue q;
        q->push(root);
    
        i = 0;
    
        while(!q){
           TREE temp = q.front();
           q->pop();
           /* if array's index contain value, create node */
           if(a[i+1] != -1){
              temp->left = createNode(a[i+1]);
              q->push(temp->left);
           }else{
              /* else assing null */
              temp->left = NULL;
           }
           /* do the same for right subtree */
           if(a[i+2] != -1){
              temp->right = createNode(a[i+2]);
              q->push(temp->right);
           }else{
              /* else assing null */
              temp->right= NULL;
           }
           i += 2;
        }
    }
    

    现在您可以从已有的数组中创建一棵树了!并且可以遍历树来获取IN或POST顺序遍历!!

    星期五快乐:)

    【讨论】:

      【解决方案2】:

      首先,你应该知道BT和BST的区别。二叉树声明它有两个孩子,或者一个孩子,或者根本没有孩子; 其中二叉搜索树,是一种特殊的二叉树,左边的值较小,右边的值较高。该属性遵循 BST 的每个属性/节点。

       Now, you have a binary tree, you want to traverse the tree in - IN, PRE and POST order. And consider this is the traversing way, not the structure
       of the tree.
      
       **Rules of PRE-ORDER:**
       1. Visit -> Root
       2. Process -> Left Child
       3. Process -> Right Child
       4. Continue (until Root is Empty)
      
      ** Rules of IN-ORDER: **
      1. Process -> Left Child
      2. Visit -> Root
      3. Process -> Right Child
      4. Continue (until Root is Empty)
      
      ** Rules of POST-ORDER: **
      1. Process -> Left Child
      2. Process -> Right Child
      3. Visit -> Root
      4. Continue (until Root is Empty)
      
      I am assuming, you already traversed in PRE-ORDER.
      
      ** IN-ORDER Traversal of your TREE **
      4 -> 3 -> 5 -> 2 -> 7 -> 6 -> 8 -> 1 -> 12 -> 10 -> 13 -> 9 -> 14 -> 11 -> 15
      
      ** POST-ORDER Traversal of your TREE **
      4 -> 5 -> 3 -> 7 -> 8 -> 6 -> 2 -> 12 -> 13 -> 10 -> 14 -> 15 -> 11 -> 9 -> 1
      

      编辑:访问这里了解遍历 -> https://medium.com/quick-code/data-structures-traversing-trees-9473f6d9f4ef

      【讨论】:

      • 感谢您花时间写答案,但问题是;当您实际上有一棵树时,很容易遍历一棵树。我的数组中有预先订购的树!我想要的是对这个预购进行逆向工程,并以某种方式使问题中的数组成为有序遍历
      【解决方案3】:

      这是家庭作业吗?“In/Pre/Post-Order”是描述树是如何遍历的,不是它的结构 .

      【讨论】:

      • 不是作业,我在数组中创建了树,就像您在问题中看到的那样。现在我想在该预排序数组中进行排序!我在网上的任何地方都找不到。我试图自己转换它,但解决方案非常不优雅。希望有更好的解决方案。
      猜你喜欢
      • 2012-12-10
      • 2012-12-16
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 2018-06-30
      相关资源
      最近更新 更多