📅  最后修改于: 2023-12-03 15:23:28.492000             🧑  作者: Mango
在两个二叉搜索树中查找共同节点的问题是常见的算法问题。该问题可以通过对两个树进行遍历,寻找相同节点解决。本文将介绍两种不同的方法用于解决该问题:递归和非递归遍历。
递归方法是一种常见的树遍历方法,对于每一个节点,递归遍历其左右子树。对于每一个节点,判断其是否和另一个树的节点相同。若相同,则打印该节点的值。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_common_node(root1: TreeNode, root2: TreeNode):
if not root1 or not root2:
return
if root1.val == root2.val:
print(root1.val)
find_common_node(root1.left, root2.left)
find_common_node(root1.right, root2.right)
非递归方法使用栈来遍历树,它可以保证在遍历过程中不会采用递归。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def find_common_node(root1: TreeNode, root2: TreeNode):
if not root1 or not root2:
return
stack1, stack2 = [], []
while stack1 or root1 or stack2 or root2:
while root1:
stack1.append(root1)
root1 = root1.left
while root2:
stack2.append(root2)
root2 = root2.left
node1, node2 = stack1[-1], stack2[-1]
if node1.val == node2.val:
print(node1.val)
stack1.pop()
stack2.pop()
root1, root2 = node1.right, node2.right
elif node1.val < node2.val:
stack1.pop()
root1 = node1.right
else:
stack2.pop()
root2 = node2.right
本文介绍了两种不同的方法用于寻找两个二叉搜索树中共同节点的问题:递归遍历和非递归遍历。递归遍历的实现简单明了,但对于大树而言,有可能会导致栈空间的溢出。非递归遍历对于较大的树而言更为适用。在实际应用中,可以根据树的大小和结构选择使用不同的方法。