📌  相关文章
📜  在两个二叉搜索树中打印公共节点(1)

📅  最后修改于: 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
总结

本文介绍了两种不同的方法用于寻找两个二叉搜索树中共同节点的问题:递归遍历和非递归遍历。递归遍历的实现简单明了,但对于大树而言,有可能会导致栈空间的溢出。非递归遍历对于较大的树而言更为适用。在实际应用中,可以根据树的大小和结构选择使用不同的方法。