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

📅  最后修改于: 2023-12-03 14:50:20.867000             🧑  作者: Mango

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

简介

二叉树是一种非常常见的数据结构,删除给定节点后打印二叉树的森林是二叉树中比较常见的操作。在这个操作中,我们需要根据给定的二叉树节点,找出其在整个二叉树中的位置,并删除该节点。删除节点后,我们需要将二叉树剩余的部分组成森林,并输出每个森林。

实现

在实现该操作时,我们可以采用递归的方式来遍历整个二叉树,并在遍历到给定节点时进行删除操作。具体实现如下:

1. 定义二叉树节点

在实现二叉树操作之前,我们需要先定义二叉树的节点结构,其包含左右子节点和节点值三个成员。

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
2. 删除给定节点

删除给定节点的操作比较简单,我们只需要将其父节点指向另一个节点即可。注意需要分别处理左右子节点的情况。

def deleteNode(root, node):
    if not root:
        return None 
    if root.val == node.val:
        if not root.left and not root.right:   # 没有左右子树的情况
            return None
        if not root.left:   # 只有右子树的情况
            return root.right
        if not root.right:  # 只有左子树的情况
            return root.left
        # 左右子树都存在的情况
        minNode = getMin(root.right)
        root.val = minNode.val
        root.right = deleteNode(root.right, minNode)
    elif root.val > node.val:
        root.left = deleteNode(root.left, node)
    else:
        root.right = deleteNode(root.right, node)
    return root

def getMin(node):
    while node.left:
        node = node.left
    return node
3. 打印二叉树森林

在删除给定节点之后,我们需要将二叉树剩余的部分组成森林,并输出每个森林。我们可以采用前序遍历的方式来遍历整个二叉树,并使用一个字典来记录各个森林的根节点。

def printForest(root, lists):
    if not root:
        return
    if not root.left and not root.right:
        return
    if not root.left:
        if root.right val in lists:
            lists[root.right.val].append(root.right)
        else:
            lists[root.right.val] = [root.right]
    elif not root.right:
        if root.left.val in lists:
            lists[root.left.val].append(root.left)
        else:
            list[root.left.val] = [root.left]
    else:
        if root.left.val in lists:
            lists[root.left.val].append(root.left)
        else:
            list[root.left.val] = [root.left]
        if root.right.val in lists:
            lists[root.right.val].append(root.right)
        else:
            list[root.right.val] = [root.right]
    printForest(root.left, lists)
    printForest(root.right, lists)
总结

删除给定节点后打印二叉树的森林是一个比较常见的操作,其实现并不困难。我们只需要使用递归的方式来遍历整个二叉树,并在遍历到给定节点时进行删除操作,并使用字典来记录各个森林的根节点即可。操作的时间复杂度为 $O(n \log n)$。