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