如何从其顺序和后序值重新创建二叉树?

时间:2015-10-25 20:29:12

标签: java binary-tree tree-traversal inorder postorder

for (int i=0; i<SizeofDataGrid;i++)//save datatable into array
{
     for (int j=0; j<4;j++)
     {
         FILTERED[i,j]=Convert.ToString(interaction.Rows[i][j]);
     }
}     
for (int i = 0; i < FILTERED.GetLength(0); i++)
         {
         string UNIQUEID = UniqueUserId[i];
         for (int j = 0; j < SizeofDataGrid; j++)
         {  
             if (UNIQUEID == FILTERED[j,0])// match ID
             {
                  for (int x = 0; x < SizeofDataGrid; x++)
                  {
                      if (startpoint == FILTERED[j, 1]) //Match start Lesson
                      {
                      TotalTime[1, i] = TotalTime[1, i] + Convert.ToUInt16(FILTERED[j, 2]);
                      TotalTime[0, i] = i;
                      TotalScore[1, i] = TotalScore[1, i] + Convert.ToUInt16(FILTERED[j, 3]);
                      TotalScore[0, i] = i;
                      }
                  }
             }
        }

        } 

我相信我是在正确的轨道上,将最后的postorder值作为根,在Inorder列表中找到该值并将树分割到该值的左侧和右侧。根据我一直在尝试的内容,我能够得出这样的结果:它没有正确格式化,所以我将其截屏。

enter image description here

2 个答案:

答案 0 :(得分:1)

获取Postorder中的最后一个元素,这是你的根元素,然后在Inorder中找到该元素,并在左右列表中拆分元素,给你LEFT:&#34; 3 2 1 5 4 6&#34;和右:&#34; 9 7 11 10&#34;然后走一下Postorder列表并在找到Inorder列表中根元素索引之前的第一个数字后将其拆分,在这种情况下,这是&#34; 6&#34;所以走到6,这将给你&#34; 1 2 3 4 5 6&#34;其余的是&#34; 9 11 10 7&#34;。然后以相反的顺序插入这些列表,例如:&#34; 6 5 4 3 2 1&#34;之后&#34; 7 10 11 9&#34;这应该给你正确的树顺序。

答案 1 :(得分:0)

这有点棘手,也许是因为大脑半球有点矛盾; - )

感兴趣的参数是:

  • post:包含后序遍历的数组
  • lp:左post数组索引
  • rppost数组的正确索引
  • in:包含inorder遍历的数组
  • li:左in数组索引
  • riìn数组
  • 的指数

程序是&#34;自然&#34;递归。在每次递归时,根始终为post[rp]。这是最后访问过的节点(后序)。

因此,首先要做的是知道数组in中根的索引。为了计算,我们从li扫描到ri,我们搜索post[rp]。让i数组in中的根索引。 我认为树没有重复的密钥

鉴于root的索引,那么

  1. i - li是左子树中的节点数
  2. ri - i是右子树中的节点数
  3. 现在,in变为自然分区。左子树位于[li, i - 1]之间,右子树位于[i + 1, ri]之间。

    我认为有点混淆是确定post中的子树在哪里。左子树位于[lp, lp + (i - li) - 1]之间,右侧位于[rp - (ri - i), rp - 1]之间。考虑上面表达的每个子树的节点数(在枚举列表中)。

    有了这些知识,我们就可以设计算法了(我用伪C ++编写,但我认为很容易翻译成java):

    Node * build_postorder(const vector<int> & post, long lp, long rp,
                           const vector<int> & in, long li, long ri)
    {
      if (lp > rp)
        return nullptr; // we stop recursion when the tree is empty
    
      Node * root = new Node(post[rp]); // Creates the root with key value post[rp]
    
      int i = li;
      for (; i <= ri; ++i) // search in inorder array the index of root
        if (in[i] == post[rp])
          break; // this line must always to execute it (if everything is oK)
    
      LLINK(root) = build_postorder(post, lp, lp + (i - li) - 1, in, li, i - 1);
      RLINK(root) = build_postorder(post, rp - (ri - i), rp - 1, in, i + 1, ri);
    
      return root;
    }
    
    祝你好运!