📌  相关文章
📜  检查两棵树是否具有相同的结构(1)

📅  最后修改于: 2023-12-03 15:26:44.785000             🧑  作者: Mango

检查两棵树是否具有相同的结构

在树的数据结构中,经常需要检查两棵树是否具有相同的结构。这是一个常见的问题,本文将介绍如何检查两棵树是否具有相同的结构,以及一些常用的方法。

问题描述

给定两棵树,判断它们是否具有相同的结构。具有相同的结构是指它们的每个节点都具有相同的子节点个数,且每个子节点的排列顺序也相同。

解决方法
方法一:递归

一种简单的方法是使用递归遍历两棵树,并比较它们的每个节点。具体来说,我们需要比较两棵树的根节点,然后递归比较它们的每个子节点,直到所有节点都比较完为止。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def isSameTree(p: TreeNode, q: TreeNode) -> bool:
    if p is None and q is None:
        return True
    elif p is None or q is None:
        return False
    elif p.val != q.val:
        return False
    else:
        return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)

在上面的代码中,我们首先检查两个节点是否同时为None。如果是,我们返回True。如果其中一个节点是None而另一个不是,则返回False,因为它们的结构不同。接下来,我们检查它们的值是否相同。如果值不同,则它们的结构不同,因此返回False。最后,我们递归比较它们的子节点。如果它们的子节点也具有相同的结构,则返回True,否则返回False。

方法二:迭代

另一种方法是使用迭代遍历两棵树,并比较它们的每个节点。具体来说,我们可以使用两个栈分别存储两棵树的节点。然后,我们从两个栈中弹出一个节点,并比较它们的值。如果值不同,则它们的结构不同,因此返回False。否则,我们压入它们的子节点,继续迭代。

def isSameTree(p: TreeNode, q: TreeNode) -> bool:
    stack1, stack2 = [(p, q)], []
    while stack1:
        node1, node2 = stack1.pop()
        if node1 is None and node2 is None:
            continue
        elif node1 is None or node2 is None:
            return False
        elif node1.val != node2.val:
            return False
        else:
            stack2.append((node1.left, node2.left))
            stack2.append((node1.right, node2.right))
        if not stack1:
            stack1, stack2 = stack2, stack1
    return True

在上面的代码中,我们首先创建两个栈stack1和stack2,将两棵树的根节点压入stack1中。然后,我们开始迭代,从stack1中弹出一个节点,并将对应的节点从stack2中弹出。我们检查它们的值是否相同,如果不同,则它们的结构不同,因此返回False。否则,我们将它们的子节点压入stack2中,继续迭代。最后,如果节点全部比较完,返回True。

总结

本文介绍了如何检查两棵树是否具有相同的结构。我们介绍了两种方法:递归和迭代。这两种方法都很简单,并且都可以在实际应用中使用。如果你正在处理树的数据结构,并需要检查两棵树是否具有相同的结构,本文提供的方法将非常有用。