📌  相关文章
📜  删除二叉树中的最后一个叶子节点(1)

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

删除二叉树中的最后一个叶子节点

在二叉树中,叶子节点是指没有子节点的节点,其中最后一个叶子节点表示在先序遍历中最后一个访问的叶子节点。在本文中,我们将介绍如何删除这个节点。

算法思路

为了删除最后一个叶子节点,我们需要从根节点开始遍历整个二叉树,以找到最后一个叶子节点。在此过程中,我们需要记录当前遍历到的节点和它的父亲节点,以便后续进行删除操作。

一旦找到最后一个叶子节点,我们就可以删除它,并更新其父亲节点的指针,以便将其想象成删除最后一个节点后的二叉树的一部分。

算法实现

下面是一个Python实现示例:

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

def find_last_leaf_node(root: TreeNode) -> Tuple[TreeNode, TreeNode]:
    if not root:
        return None, None

    node, parent = root, None
    while node:
        if node.left or node.right:
            parent = node
            node = node.right or node.left
        else:
            break

    return node, parent

def delete_last_leaf_node(root: TreeNode) -> TreeNode:
    node, parent = find_last_leaf_node(root)
    if not node:
        return root

    if not parent:
        return None

    if parent.right == node:
        parent.right = None
    else:
        parent.left = None

    return root
算法分析

该算法与二叉树的先序遍历类似,因此在最坏情况下,时间复杂度为$O(n)$,其中$n$是树中节点的数量。由于在查找最后一个叶子节点时需要记录其父节点,因此空间复杂度为$O(h)$,其中$h$是树的高度。