如何解决按顺序遍历两个二叉树以比较哪个更大
我正试图找到一种方法来比较二叉树中的节点,以查看一棵树的节点是否比另一棵大。我要比较它们的方法是比较最左边的节点,根,然后比较最右边的节点。我认为最好的方法是使用递归进行有序遍历并以此方式比较节点。
但是,在递归调用函数时,我很难找到一种方法来返回正确的答案。递归确实有一种使我困惑并且无法跟踪程序正在执行操作的方式。我所拥有的是以下内容:
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.谢谢您的帮助。我搜索了许多其他地方的帮助,但我无法弄清楚。
解决方法
请注意,您的代码是伪代码,因此无法真正再现,因此我不能百分百确定您的问题正确无误,因为我不知道此问题实际上是否在您的代码中。在没有与问题无关的东西的情况下,以您正在使用的语言实际查看您的真实代码将很有用。
但是,我已经实现了您在散文和伪代码中所描述的内容,并且我相信我正在经历自己的举止。我仍然不是100%肯定我完全明白您想要什么,但是我希望这是有道理的:
基本上,您的结构是正确的。我认为您在考虑左下侧的遍历。这似乎是人们学习递归时经常遇到的问题。我在学习时经常会遇到这个问题。相反,通过递归,您可以将范围缩小到最基本的情况,并让递归处理它们。在这种情况下,我认为您有很多情况:
- node1为空,node2为空
- node1为空,node2不为空
- node1不为空,node2为空
- node1的左子!! = node2的左子
- node1的值!= node2的值
- node1的右子!! = node2的右子
- node1 == node2
我不确定您的代码是什么样子。在您的伪代码中,有两个主要问题。我认为第一个问题实际上不在您的代码中,这是当您递归时,您没有检查并返回结果。您只想在结果!= 0时返回结果。因此,而不是:
binaryTreeComparison(node1.getLeftChild(),node2.getLeftChild())
你想要
leftResult = binaryTreeComparison(node1.getLeftChild(),node2.getLeftChild())
if (leftResult != 0) return leftResult
代码的关键问题是条件重复(7)。这说明了您遇到的行为:
而不是中断并返回一个不同的节点的第一个实例,而是我认为返回的是“递归堆的顶部”,我不知道有什么办法解决这个问题
您实际上只是想删除它,因为一旦检查了node1.value return 0
会起作用:-)
这是Python中的工作代码:
from dataclasses import dataclass
@dataclass
class Tree:
value: int
left: 'Tree' = None
right: 'Tree' = None
def compare(node1: Tree,node2: Tree) -> int:
if node1 is None and node2 is None:
return 0
if node1 is not None and node2 is None:
return 1
if node1 is None and node2 is not None:
return -1
left = compare(node1.left,node2.left)
if left != 0:
return left
if node1.value > node2.value:
return 1
# This is your bug
# if node1.value == node2.value:
# return 0
if node1.value < node2.value:
return -1
right = compare(node1.right,node2.right)
if right != 0:
return right
return 0
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。