如何判断一个二叉树是否为完全二叉树

判断一个二叉树是否为完全二叉树,可以通过层序遍历(广度优先搜索,BFS)的方式来实现。完全二叉树的特点是,除了最后一层外,每一层都被完全填满,并且所有节点都尽可能地向左对齐。在层序遍历过程中,如果遇到某个节点为空(即null或None),则之后遍历到的所有节点都应该为空;如果之后还遍历到了非空节点,则说明该二叉树不是完全二叉树。

以下是一个基于层序遍历判断二叉树是否为完全二叉树的算法步骤(以Python为例):

1、初始化一个队列,并将根节点入队。

2、标记一个标志位is_end为False,用于表示是否遇到了第一个空节点。

3、当队列不为空时,进行循环:

从队列中取出一个节点。

如果该节点为空,并且is_end为False,则将is_end设置为True,表示这是遇到的第一个空节点。

如果该节点不为空,但是is_end已经为True,则说明在第一个空节点之后还存在非空节点,该二叉树不是完全二叉树,直接返回False。

如果节点不为空,则将其左子节点和右子节点(如果存在)依次入队。

4、循环结束后,如果is_end仍然为False,则说明队列中的所有节点都已经被遍历且都非空,但这并不意味着它是完全二叉树(可能是满二叉树)。然而,根据完全二叉树的定义,只要没有违反"在第一个空节点后仍有非空节点"的规则,就可以认为是完全二叉树。因此,在这种情况下,我们也可以认为它是完全二叉树(实际上,这一步是多余的,因为只要没有在第3步返回False,就可以确定它是完全二叉树)。

python 复制代码
from collections import deque

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

def isCompleteTree(root):
    if not root:
        return True  # 空树被认为是完全二叉树

    queue = deque([root])
    is_end = False

    while queue:
        node = queue.popleft()

        if not node:
            is_end = True
            continue

        if is_end:
            return False  # 遇到了第一个空节点之后还有非空节点

        queue.append(node.left)
        queue.append(node.right)

    return True

# 使用示例
# 构建一个完全二叉树
#       1
#      / \
#     2   3
#    / \   \
#   4   5   6
# 注意:这里并没有完全按照完全二叉树的规则来构建(比如节点6的左子树为空),
# 但为了示例,我们假设它是一个"逻辑上"的完全二叉树,即只关注是否存在"在第一个空节点后仍有非空节点"的情况。
# 实际上,在构建二叉树时,我们通常不会显式地创建空节点。
# 下面的代码只是为了演示如何连接节点,并没有真正地创建空节点。
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.right = TreeNode(6)

# 调用函数检查
print(isCompleteTree(root))  # 输出: True(在这个特定的"逻辑"下)
相关推荐
shangjian0071 小时前
AI大模型-评价指标-相关术语
人工智能·算法
f***68601 小时前
【SpringBoot篇】详解Bean的管理(获取bean,bean的作用域,第三方bean)
java·spring boot·后端
Live&&learn2 小时前
算法训练-数据结构
数据结构·算法·leetcode
likuolei2 小时前
Eclipse 快捷键
java·ide·eclipse
必胜的思想钢印2 小时前
修改主频&睡眠模式&停机模式&待机模式
笔记·stm32·单片机·嵌入式硬件·学习
胡萝卜3.03 小时前
掌握C++ map:高效键值对操作指南
开发语言·数据结构·c++·人工智能·map
松岛雾奈.2304 小时前
机器学习--PCA降维算法
人工智能·算法·机器学习
电子_咸鱼4 小时前
【STL string 全解析:接口详解、测试实战与模拟实现】
开发语言·c++·vscode·python·算法·leetcode
therese_100864 小时前
面试试试试试试题-答
面试
sweet丶4 小时前
适合iOS开发的一种缓存策略YYCache库 的原理
算法·架构