【问题标题】:Building Binary Tree from Pre and In order从 Pre 和 In order 构建二叉树
【发布时间】:2013-08-12 04:38:22
【问题描述】:

我正在尝试从有序和预购构建二叉树。 每个节点都保存一个整数值的数据。 我在使用这些数组时遇到了问题:

预购:3,9,2,6,1,1,1,4
有序: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;
    }
}

提前致谢

【问题讨论】:

  • 当您有重复时,树结构可能不明确。您只是在寻找一种解决方案吗?
  • 是的,我正在寻找特定的解决方案。当有重复时,有没有办法从 pre 和 order 中构建特定的树?
  • {In,Pre}Order 是在构建二叉树之后遍历二叉树的方法。你怎么知道你已经在或预购的序列?
  • 我从我已经拥有的树中提取它们(我想发布树的图像,但我没有足够的声望点)。在我的示例中,“1,1,1”实际上是一个以 1 为根,左右子节点均为 1 的子树。
  • 您能否更具体地说明您所说的“特定树”的含义?您是说您已经对树的结构有所了解,还是您的意思是在所有可能的树中,您正在寻找最符合某些标准(例如具有最小深度)的树?

标签: c binary-tree traversal


【解决方案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}

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

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

例如: 使用 -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 }

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

【讨论】:

  • 非常感谢您的帮助。仅使用遍历,有没有办法确定一棵树的样子?如果我给出树的深度,如果树的深度为 4(底部的“1,1”可能在左侧或右侧),对于这棵特定的树,我仍然有两个选项。
  • 即使你指定了树的深度,你也会遇到上面第二个和第三个图的歧义。我在上面只描述了 3 个结构,并且存在更多结构,您将面临歧义。 @DavidTzoor
  • 为什么你的输入数组只有节点值。为什么不能将边界存储在其中以重新创建确切的结构。如果不指定边界,您将始终以歧义告终。 @DavidTzoor
  • 那是他们在课堂上教我们的方式,但是当我尝试上面的例子时,我遇到了歧义。你说的边界是什么意思? “固定”数组应该是什么样子?
  • @DavidTzoor 检查编辑。它将向您解释边界。它只是我脑海中闪现的一个快速解决方案。
【解决方案2】:

歧义源于叶节点未完全定义的事实。为不被构建的节点定义一个占位符(0 或 -1),并使用括号来显示列表的结构。

预购:3(9(2)(0))(6 (1(1)(1)) (4)) 带括号和占位符零,不带括号相同的数字序列可以“加括号" 为 3(9(2)(0))(6(1)(1(1)(4)))。

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

【讨论】:

    猜你喜欢
    • 2016-01-22
    • 1970-01-01
    • 2016-11-06
    • 2019-10-18
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多