📜  检查二叉树是否为满二叉树(1)

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

检查二叉树是否为满二叉树

什么是满二叉树?

满二叉树(Full Binary Tree)是指在一颗二叉树中,除了叶子结点外,每个结点都有左右子树,并且左右子树的结点数相等。也就是说,满二叉树的每一层都被完全填满,可表示为一个满的二叉树。

下图为满二叉树的示例:

Full Binary Tree

如何检查二叉树是否为满二叉树?

检查二叉树是否为满二叉树,需要用到以下两个特性:

  1. 由满二叉树的定义可知,任意一个非叶子结点必须同时具有左右子树。
  2. 首先,从根结点开始,计算左子树和右子树的高度。
  3. 如果左右子树的高度相等,则说明该子树为满二叉树,递归判断其左右子树是否为满二叉树。
  4. 如果左右子树的高度不相等,则该子树一定不是满二叉树。

因此,我们可以写出以下递归代码片段:

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

def is_full_binary_tree(root: TreeNode) -> bool:
    """检查二叉树是否为满二叉树"""
    if not root:
        return True

    left_height = get_height(root.left)
    right_height = get_height(root.right)

    if left_height == right_height:
        return is_full_binary_tree(root.left) and is_full_binary_tree(root.right)

    return False

def get_height(node: TreeNode) -> int:
    """计算二叉树的高度"""
    if not node:
        return 0

    return 1 + max(get_height(node.left), get_height(node.right))
时间复杂度

由于要递归遍历整个二叉树,因此时间复杂度为 $O(n)$。

空间复杂度

由于递归调用时需要使用栈空间,空间复杂度为 $O(h)$,其中 $h$ 为二叉树的高度。如果是满二叉树,则 $h = log_2n$。