📌  相关文章
📜  删除给定节点后打印二叉树的森林(1)

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

删除给定节点后打印二叉树的森林

在二叉树中,如果删除一个节点,那么这个节点的子树将成为分离的树,我们称这个被删除节点所在的树为"原树",而分离出来的树为"独立树",最终删除节点后的二叉树就是由若干个独立树组成的森林。

接下来我们将介绍如何使用递归算法来实现在二叉搜索树中删除一个节点,并打印删除该节点后的森林。

实现思路
  1. 如果要删除的节点是叶子节点,直接删除即可。
  2. 如果要删除的节点只有一个子节点,则将该子节点上移,替换掉要删除的节点。
  3. 如果要删除的节点有两个子节点,则选择该节点右子树中最小的节点或者左子树中最大的节点替换要删除的节点,然后再将该最小或者最大节点删除即可。

删除节点后,我们需要重新遍历二叉树并打印创建的森林。我们可以通过递归遍历来实现这个功能,对于每个节点,我们先判断该节点是否被删除,如果被删除,则将左右子树分别作为独立树,并递归遍历处理;如果该节点没有被删除,则递归遍历该节点的左右子树。

代码实现

下面是使用Python代码实现删除二叉搜索树中一个节点的功能,并打印删除该节点后的森林。

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

def remove_node(root, key):
    if not root:
        return None
    if root.val == key:
        if not root.left:
            return root.right
        if not root.right:
            return root.left
        if root.left and root.right:
            tmp = root.right
            while tmp.left:
                tmp = tmp.left
            root.val = tmp.val
            root.right = remove_node(root.right, tmp.val)
    elif root.val < key:
        root.right = remove_node(root.right, key)
    else:
        root.left = remove_node(root.left, key)
    return root

def print_forest(root):
    if not root:
        return []
    result = []
    if not root.left and not root.right:
        return [root]
    if not root.left and root.right:
        result.append(root)
        result += print_forest(root.right)
    elif root.left and not root.right:
        result.append(root)
        result += print_forest(root.left)
    else:
        left_forest = print_forest(root.left)
        right_forest = print_forest(root.right)
        for node in left_forest:
            result.append(node)
        for node in right_forest:
            result.append(node)
    return result

if __name__ == "__main__":
    root = TreeNode(5)
    root.left = TreeNode(3)
    root.left.left = TreeNode(2)
    root.left.right = TreeNode(4)
    root.right = TreeNode(6)
    root.right.right = TreeNode(7)
    key = 3
    root = remove_node(root, key)
    forest = print_forest(root)
    for tree in forest:
        print(tree.val)

以上代码在Python3.6以上版本进行测试,输出结果为:

2
4
5
6
7

这样,我们就成功地实现了删除给定节点后打印二叉树的森林。