Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造给定后序的二叉树_Java_Algorithm_Data Structures_Binary Tree - Fatal编程技术网

Java 构造给定后序的二叉树

Java 构造给定后序的二叉树,java,algorithm,data-structures,binary-tree,Java,Algorithm,Data Structures,Binary Tree,如果只提供后序遍历信息,如何构造二叉树。在谷歌上搜索过这个主题后,我明白在这种情况下不可能有唯一构造的二叉树。但若给定整数,就很容易基于小于或大于该属性创建BT。但若我们有字母表,那个么我就不知道我们是根据什么来做父节点的左节点还是右节点。这是我试图解决的问题 Q) 二叉树的后序遍历是DEBFCA。找出前序遍历吗 选项: (A) ABFCDE (B) ADBFEC (C) ABDECF (0)ABDCEF 正确答案是:C 有人能解释一下我们是如何得到答案的吗 我觉得这个答案很有帮助,但从第三步开

如果只提供后序遍历信息,如何构造二叉树。在谷歌上搜索过这个主题后,我明白在这种情况下不可能有唯一构造的二叉树。但若给定整数,就很容易基于小于或大于该属性创建BT。但若我们有字母表,那个么我就不知道我们是根据什么来做父节点的左节点还是右节点。这是我试图解决的问题

Q) 二叉树的后序遍历是DEBFCA。找出前序遍历吗

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

正确答案是:C

有人能解释一下我们是如何得到答案的吗

我觉得这个答案很有帮助,但从第三步开始,我不明白事情是怎么发生的。
谢谢你的时间

在多项选择题中有很多次都有拼写错误。这里也一样,没有O。 唯一树不能仅通过后序绘制来回答问题,我们必须搜索一个可能的预序,它可以如下所示(ABDECF),所以ans是C(假设输入错误选项),因为a最后是后序,所以它必须是根,所以一个可能的树如下所示


在知道A是根之后,我们只剩下DEBFC。这里,一些节点属于二叉树的左侧,一些属于右侧。有多少节点属于左侧,有多少节点属于右侧。由于首先考虑二叉树的左侧,并且每个节点最多有两个子节点,因此DEB将是二叉树的左侧,FC将是右侧。现在,我们知道FC位于二叉树的右侧。最后一个节点是子树的根,F是它的左边。接下来我们来到二叉树的左边,它是DEB。同样,B将是子树的根。D和E分别是它的左侧和右侧。这样就创建了树

预序遍历的一般算法如下所示

public void preorder(Node n) {
    if(n == null) {
        return;
    }
    System.out.println(n.data);
    preorder(n.left);
    preorder(n.right);
}
因此,在进行预序遍历时,在验证节点是否为null后,它要做的第一件事就是打印出节点的值。然后它继续递归地首先调用节点的左子节点上的方法,然后再调用右子节点上的方法。因此,应该很容易看到前三个字母是ABD,因为preorder方法将在树的最左侧递归调用。D没有子级,因此前序遍历返回到它对B的方法调用。现在B的右子级被访问,因此顺序现在是ABDE。E没有子级,所以预排序遍历返回到B。但是B的所有子级都已检查,所以现在返回到A。现在对A的右子级调用了预排序方法。现在的命令是ABDEC。C只有一个左子级,因此访问F后完成前序遍历,最后的顺序是ABDECF

若给定整数,则很容易基于小于或大于该属性创建BT。但若我们有字母表,那个么我不知道我们是根据什么来做左节点还是右节点

在Java
(“B”>“A”)==true
,因为字符串是按字典顺序比较的

二叉树的后序遍历是DEBFCA


根据邮政订单的定义,你知道A是根本,所以问题是B或D是A.的左边还是右边(如果你考虑给你的选择)

同样从后序中,您知道D必须是非常左的元素,因为它位于后序字符串的开头。现在您可以排除选项A(
D
不是
C
的子项)和选项B(
D
不是
A
的直接左边)

此时,您可以确定您的树看起来是这样的,因为后期排序以
CA
结束,以
D
开始

    A 
  B    C
 ...   ...
D     ......
在post顺序中,您有
FCA
,因此F将是C的子级,C是
a
的子级

    A 
  B    C
 ...   ...
D     ...  F
我们已经完成了除E之外的所有内容。从邮政订单中,您有
DE
,我们有D作为最左边的叶子,因此E一定是它的兄弟

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


通过消除,选项C仍然存在

@daniel fischer你能帮我回答这个问题吗?这不是你通知别人的方式。你可以用他们的用户名@我觉得你发的字符串不对。问题字符串中没有字母O,因此C不正确。@4可能是键盘问题。0和O应该是D,我想在Quora中给出了相同的问题答案。很明显,A将是根。在左、右子代中,在什么基础上加上B、C,其他子代也可以这样做,其他子代也可以这样做。在知道A是根后,请参见编辑以获取解释。Cheerron你声称“DEB将是二叉树的左侧,FC”的依据是什么,因为所有的DEBFC都可以是左子树或右子树。说每个节点最多可以有2个子节点并不能阻止“DEBFC”成为左子树或右子树的一部分。请参阅并前往评论部分。thxAlright。为了使其更简单,并且从这个问题的角度来看,您不能为选项A、B和D生成树。尝试更简单。回答您关于“DEB”和“FC”的基础是什么的问题是正确的…根是A。然后它从左到右,所以DEB和FC作为DEB是后序中最左边的部分。但在MCQ中,我建议你从选项中选择,并尝试排除其他选项。如果你有更多疑问,请联系。干杯!“你知道A是根,所以问题是B或D是在A的左边还是右边。”你为什么只考虑B或D。为什么不使用BF或DE(假设您正在比较给定的预排序选项)“如果这是一个真正有序的二叉树,B在左边。这排除了选项B。”——我不确定他们是否在谈论真正有序的二叉树。如果他们不是在谈论什么呢
     A 
  B    C
D  E     F