根据后序构造二叉树

时间:2017-02-01 04:43:37

标签: java algorithm data-structures binary-tree

如果只给出的信息是后期遍历,如何构造二叉树。用Google搜索主题,我理解在这种情况下不能有唯一构造的二叉树。但是如果给定整数,那么基于较少或更大的属性来创建BT变得容易。但是如果我们有字母表,那么我无法弄清楚我们在什么基础上创建父节点的左节点或右节点。这是我正在努力解决的问题。

Q)二叉树的后序遍历是DEBFCA。找出预订遍历?

选项:
(A)ABFCDE
(B)ADBFEC
(C)ABDECF
(0)ABDCEF

正确答案是:C

有人可以解释我们如何回答。

我发现这个答案https://www.quora.com/If-the-post-order-traversal-of-a-binary-tree-is-DEBFCA-how-can-I-find-out-the-pre-order-traversal/answer/Eugene-Yarovoi?srid=zy7j非常有帮助但是第3步以后我不明白事情是怎么回事。 谢谢你的时间

3 个答案:

答案 0 :(得分:1)

  

如果给定整数,则基于更少或更大的属性来创建BT变得容易。但是,如果我们有字母表,那么我无法弄清楚我们在什么基础上制作左节点或右节点

好吧,在Java ("B" > "A") == true中,因为字符串按字典顺序进行比较......

  

二叉树的后序遍历是DEBFCA

根据下订单的定义,你知道A是根,所以问题是B或D是否在A的左边或右边。(如果你考虑给你的选择)

同样来自后期排序,你知道D必须是最左边的元素,因为它位于后序字符串的开头。现在您可以排除选项A(D不是C的孩子)和选项B(D不会立即离开A)。

此时,您可以确定您的树是这样的,因为帖子排序以CA结尾,并以D

开头
    A 
  B    C
 ...   ...
D     ......

在后期订单中,您有FCA,因此F将是C的子级,这是A的子级,以便按此顺序发生。

    A 
  B    C
 ...   ...
D     ...  F

我们已经完成了除E之外的所有操作。从后期订单中,您有DE,我们将D作为最左边的叶子,所以E必须是它的兄弟姐妹。

这是完整的树(我认为F的位置可以互换)

     A 
  B    C
D  E     F

通过淘汰,选项C仍然存在。

答案 1 :(得分:0)

在多项选择题中多次出现错别字。这里同样没有O. 唯一的树不能只通过邮政订单来回答我们必须搜索可能的预订,如下(ABDECF)所以ans是C(假设选项中的拼写错误),因为A最后是后期顺序所以它必须是root,所以一个可能的树就是

enter image description here

在您知道A是根之后我们只剩下DEBFC。这里一些节点属于二叉树的左侧,一些节点属于右侧。左边有多少个节点,右边有多少个节点。由于二叉树的左侧被认为是第一个,并且由于每个节点最多有两个子节点,因此DEB将是二叉树的左侧,FC将是右侧。现在,我们知道FC在二叉树的右侧。同样,最后一个节点将是子树的根,F是它的左侧。接下来我们来到二叉树的左侧,它是DEB。 B再次是子树的根。 D和E分别是它的左侧和右侧。因此树被创造!!

答案 2 :(得分:0)

前序遍历的一般算法如下,

public void preorder(Node n) {
    if(n == null) {
        return;
    }
    System.out.println(n.data);
    preorder(n.left);
    preorder(n.right);
}

因此,当进行前序遍历时,在验证节点不是null之后,它首先要打印出节点的值。然后它继续递归地调用节点的左边的孩子的方法,右边的孩子秒。因此,应该很容易看到前三个字母是ABD,因为预订方法将在树的最左边的左侧递归调用。 D没有孩子,所以前序遍历回到B上的方法调用。现在B的右子被访问,因此命令现在是ABDE。 E没有孩子,所以前序遍历可以追溯到B.但是所有B的孩子都已经过检查,所以现在它又回到A.现在预先安排的方法是在A的孩子身上调用的。现在订单是ABDEC。 C只有一个左子,所以在访问F后完成前序遍历,最后的顺序是ABDECF。

相关问题