从Pre和按顺序构建二叉树

时间:2013-08-12 04:38:23

标签: c binary-tree traversal

我正在尝试从按顺序和预订中构建二叉树。 每个节点都包含数据的整数值。 我有这些数组时遇到问题:

  

预购:3,9,2,6,1,1,1,5
  按顺序:2,9,3,1,1,1,6,4

这是从中提取遍历的原始树:

    3
   / \
  9   6
 /   / \
2   1   4
   / \
  1   1

问题是我写的函数无法区分连续的相等数字。

这是C:

中的功能
TREE createTreeFromPreAndIn(int pre[], int in[], int n){
    TREE res;
    res.root = createTreeFromPreAndInHelper(pre, in, n);
    return res;
}

TNODE* createTreeFromPreAndInHelper(int pre[], int in[], int n){
    int index;
    TNODE* rootL, *rootR, *root;

    if (n == 0)
        return NULL;
    else {
        index = findIndex(in, n, pre[0]); //returns the index of the first appearance of pre[0] in 'in'
        rootL = createTreeFromPreAndInHelper(pre+1, in, index);
        rootR = createTreeFromPreAndInHelper(pre+1+index, in+index+1, n-index-1);
        root = createNewTreeNode(pre[0], rootL, rootR);
        return root;
    }
}

提前致谢

2 个答案:

答案 0 :(得分:1)

您没有足够的要求来识别确切的图像。您上面的树也可以表示为

              Fig 1                       Fig 2                      Fig 3

                3                          3                           3   
               / \                        / \                         / \
              9   6                      9   6                       9   6
             /   / \                    /   / \                     /   / \
            2   1   4                  2   1   4                   2   1   4
               / \                        /                             \
              1   1                      1                               1 
                                        /                               / 
                                       1                               1

以上所有树根据您的启动提供相同的有序和预订集。

有序= {2,9,3,1,1,1,6,4}

预购= {3,9,2,6,1,1,1,4}

存在歧义。因此,您无法使用此信息识别确切的树。您必须指定其他信息才能解决此问题。

如果要重新创建它,可以尝试在数组中包含边界。

对于ex: 使用-1指定no-child(假设我的节点值在任何情况下都不是-1)。

图1:

有序:{-1,2,-1,9,-1,3,-1,1,-1,1,-1,1,-1,6,-1,4,-1 }

预购:{3,9,2,-1,-1,-1,6,1,1,-1,-1,1,-1,-1,4,-1,-1 }

图2:

有序:{-1,2,-1,9,-1,3,-1,1,-1,1,-1,1,-1,6,-1,4,-1 }

预购:{3,9,2,-1,-1,-1,6,1,1,1,-1,-1,-1,-1,4,-1,-1 }

显然,预购将会改变,它可以帮助您避免歧义并重新创建所需的结构。

答案 1 :(得分:0)

模糊性源于叶节点未完全定义的事实。为不要构建的节点定义占位符(0或-1),并使用USE parens显示列表的结构。

预购:3(9(2)(0))(6(1(1)(1))(4))与parens和占位符零没有parens相同的数字序列可以“括号“为3(9(2)(0))(6(1)(1(1)(4)))。

重复的数字与歧义无关。数字未定义其在结构中的位置。相反,这是一个预订二叉树的事实,其中每个节点(即父母)根据定义左右儿童,但每个孩子可以是有两个孩子的父母!因此,元素列表必须将树“填充”到它的叶子。