【发布时间】:2021-01-14 06:30:34
【问题描述】:
我正在尝试找到一种方法来比较二叉树中的节点,以查看一棵树的节点是否比另一棵“大”。我想比较它们的方式是比较最左边的节点、根节点,然后是最右边的节点。我认为最好的方法是使用递归执行有序遍历并以这种方式比较节点。
但是,在递归调用该函数时,我很难找到一种方法让它返回正确答案。递归确实有一种让我感到困惑并忘记程序正在做什么的方式。我有以下内容:
function binaryTreeComparison(node1, node2) {
if node1 and node2 is null
return 0
if node1 is not null, but node2 is null
return 1
if node1 is null, but node2 is not null
return -1
else {
binaryTreeComparison(node1.getLeftChild(), node2.getLeftChild())
if node1 > node 2
return 1
else if node1 = node 2
return 0
else if node1 < node2
return -1
binaryTreeComparison(node1.getRightChild(), node2.getRightChild());
}
return 0
}
对我尝试伪代码表示歉意。试图创建一个最小的、可重复的示例。发生了什么,而不是中断并返回不同的节点的第一个实例,而是我认为它返回“递归堆的顶部”,我不知道有什么方法可以解决这个问题。我确信这与我没有做类似return binaryTreeComparison(node1.getLeftChild(), node2.getLeftChild()); 的事情有关。例如,如果我们有两棵像这样的二叉树:
4 4
/ \ / \
2 5 6 5
然后它应该在访问左下角节点后返回 -1,因为 6 > 2。相反,它返回 0,因为它在树的顶部比较 4 = 4。不同高度的树木的另一个例子是:
4 4
/ \ / \
6 5 6 5
/
3
这里左边的树会大于右边的树,因此返回 1。谢谢你的帮助。我搜索了许多其他地方以寻求帮助,但我无法弄清楚。
【问题讨论】:
-
两棵二叉树的结构一样吗?换句话说,它们是否具有相同数量的节点、相同数量的叶节点、相同数量的级别和相同数量的分支?您问题中的图表显示了两个具有相同结构的二叉树。
-
不是先比较值,而是推迟比较,直到比较子项。您需要确定如果一侧有子节点而另一侧没有子节点意味着什么......我也不确定我是否理解您的示例 - 假设顶部有 4 和排序树,左边孩子应该小于 4 岁。
-
@Abra 这些树可能有不同的结构。但是,它们仍然被归类为二叉树。
-
那么,如果一棵树的层级比另一棵树多,你比较的是哪些节点?也许edit您的问题,并发布两个具有不同级别的二叉树的示例以及您希望如何比较它们。
-
@Gus 例如,可以给定的树不是最大堆或最小堆,因此子级增加或减少之间没有真正的关系。它们只是随机值。你会如何首先比较孩子?我做了 if 语句的第一部分,为递归提供了一种“退出条件”,以便它在到达叶子时停止。
标签: java recursion binary-tree nodes inorder