按顺序遍历两个二叉树以比较哪个更大

问题描述

我正试图找到一种方法来比较二叉树中的节点,以查看一棵树的节点是否比另一棵大。我要比较它们的方法是比较最左边的节点,根,然后比较最右边的节点。我认为最好的方法是使用递归进行有序遍历并以此方式比较节点。

但是,在递归调用函数时,我很难找到一种方法来返回正确的答案。递归确实有一种使我困惑并且无法跟踪程序正在执行操作的方式。我所拥有的是以下内容:

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%肯定我完全明白您想要什么,但是我希望这是有道理的:

基本上,您的结构是正确的。我认为您在考虑左下侧的遍历。这似乎是人们学习递归时经常遇到的问题。我在学习时经常会遇到这个问题。相反,通过递归,您可以将范围缩小到最基本的情况,并让递归处理它们。在这种情况下,我认为您有很多情况:

  1. node1为空,node2为空
  2. node1为空,node2不为空
  3. node1不为空,node2为空
  4. node1的左子!! = node2的左子
  5. node1的值!= node2的值
  6. node1的右子!! = node2的右子
  7. node1 == node2

我不确定您的代码是什么样子。在您的伪代码中,有两个主要问题。我认为第一个问题实际上不在您的代码中,这是当您递归时,您没有检查并返回结果。您只想在结果!= 0时返回结果。因此,而不是:

binaryTreeComparison(node1.getLeftChild(),node2.getLeftChild())

你想要

leftResult = binaryTreeComparison(node1.getLeftChild(),node2.getLeftChild())
if (leftResult != 0) return leftResult

代码的关键问题是条件重复(7)。这说明了您遇到的行为:

而不是中断并返回一个不同的节点的第一个实例,而是我认为返回的是“递归堆的顶部”,我不知道有什么办法解决这个问题

您实际上只是想删除它,因为一旦检查了node1.value node2.value,您就会知道该node1.value == node2.value。但是,您必须等到之后检查右侧后再返回0,否则您将始终忽略右侧的子级。相信底部的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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...