返回

958. 二叉树的完全性检验:全面解析,一文掌握二叉树完备性鉴定

闲谈

背景介绍:什么是完全二叉树?

在计算机科学中,完全二叉树 被定义为一类特殊的二叉树,其满足以下条件:

  1. 所有非叶子节点(即有子节点的节点)都必须拥有两个子节点。
  2. 所有叶子节点都必须位于同一层。

换句话说,完全二叉树是一种特殊的二叉树,除了最底层的叶子节点可能存在空节点外,其余各层都被完美地填满。

算法思想:如何鉴定二叉树的完全性?

为了判断一棵二叉树是否完全,我们可以使用两种常见的方法:

  1. 广度优先搜索(BFS) :利用队列作为辅助数据结构,逐层遍历二叉树,当遇到非空节点而其右子节点为空或左子节点为空时,则该树不为完全二叉树。
  2. 深度优先搜索(DFS) :采用递归方式,从根节点开始深度遍历二叉树,记录每个节点的深度,并比较每个节点的左子节点和右子节点的深度是否相等,若不相等,则该树不为完全二叉树。

代码实现:两种算法的具体实现

广度优先搜索(BFS)实现

def is_complete_tree_bfs(root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    queue = collections.deque([root])
    has_null = False  # 是否遇到过空节点
    while queue:
        node = queue.popleft()
        if not node:
            has_null = True  # 遇到空节点
        else:
            if has_null:
                return False  # 非空节点后遇到空节点,说明不是完全二叉树
            queue.append(node.left)  # 将左子节点入队
            queue.append(node.right)  # 将右子节点入队
    return True  # 遍历完所有节点,没有遇到不符合完全二叉树条件的情况,说明是完全二叉树


深度优先搜索(DFS)实现

def is_complete_tree_dfs(root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    def dfs(node, depth):
        if not node:
            return depth  # 空节点的深度为0
        left_depth = dfs(node.left, depth + 1)  # 左子节点的深度
        right_depth = dfs(node.right, depth + 1)  # 右子节点的深度
        if left_depth != right_depth:
            return -1  # 左子节点和右子节点的深度不相等,说明不是完全二叉树
        return left_depth  # 返回当前节点的深度

    if not root:
        return True  # 空树是完全二叉树
    depth = dfs(root, 0)  # 计算根节点的深度
    return depth != -1  # 如果深度不为-1,说明是完全二叉树


时间与空间复杂度分析

  • 时间复杂度:

    • BFS:O(n),其中n为二叉树的节点数。
    • DFS:O(n),其中n为二叉树的节点数。
  • 空间复杂度:

    • BFS:O(n),因为最坏情况下,队列中可能包含所有节点。
    • DFS:O(h),其中h为二叉树的高度。

结语:掌握二叉树完备性鉴定的精髓

通过对958. 二叉树的完全性检验问题的深入探索,我们不仅学习了两种常见的二叉树完备性鉴定算法——广度优先搜索和深度优先搜索,还理解了二叉树的完备性概念,以及其判定标准和意义。希望您能够将这些知识应用于实际编程实践中,不断提升您对算法和数据结构的理解和运用能力。