完美二叉树、完全二叉树、完满二叉树

1、二叉树(Binary Tree)

1.1 什么是二叉树(Binary Tree)

每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒。

1.2 二叉树的性质

  1. 若二叉树的层次从0开始,则在二叉树的第i层至多有2^i个结点(i>=0)。
  2. 高度为k的二叉树最多有2^(k+1) - 1个结点(k>=-1)。 (空树的高度为-1)
  3. 对任何一棵二叉树,如果其叶子结点(度为0)数为m, 度为2的结点数为n, 则m = n + 1。

2、完美二叉树

一个深度为k(>=-1)且有2^(k+1) - 1个结点的二叉树称为完美二叉树
换句话说:树是满的,还是二叉的
图是这样的:
这里写图片描述

3、完全二叉树(Complete)

完全二叉树从根结点到倒数第二层满足完美二叉树,最后一层可以不完全填充,其叶子结点都靠左对齐

下图就不是一棵完全(Complete)二叉树
这里写图片描述
如果将编号11(K)结点从编号6(E)的左儿子位置移动到编号5(E)的右儿子位置,则变成一棵完全(Complete)二叉树。

  • 其实,理解完全(Complete)二叉树可以借助于栈(stack)的思想。 例如,把第一个图中的完美(Perfect)二叉树的所有结点按照编号1, 2, 3, …, 15依次入栈(push)。 那么,对栈的每一次出栈(pop)操作后,栈里保存的结点集对应到图上去都是一棵完全(Complete)二叉树

4、完满二叉树

所有非叶子结点的度都是2
换句话说:只要你有孩子,你就必然是有两个孩子。


参考博客:
完美二叉树, 完全二叉树和完满二叉树


例:
一个具有767个节点的完全二叉树,其叶子节点的个数为____
A . 383
B . 384
C . 385
D . 386

n = n2+n1+no
n0 = n2 + 1

可得方程:n0= (768-n1) / 2,又因完全二叉数节点为1的数要不为1要不为0,故选B。

  • n:总节点数
  • n2:度为2的节点数
  • n1:度为1的节点书
  • n0:度为0节点数
### 完美二叉树完全二叉树的区别和定义 #### 完美二叉树(满二叉树完美二叉树是指除最后一层外每一层上的所有节点都有两个子节点,并且所有的叶子都在同一层次上。这意味着: - 所有的内部节点都有两颗非空子树。 - 叶子节点全部位于最底层。 这种类型的二叉树具有特定的高度 h 和节点数 n 的关系:n = 2^(h+1)-1,其中根节点处于第0层[^3]。 #### 完全二叉树 相比之下,完全二叉树是一种几乎填满了所有级别的二叉树,除了可能的最后一级不一定是完整的。具体来说,在一棵深度为 k 的完全二叉树中: - 前 k−1 层是满的; - 如果最后一层不是满的,则该层中的所有节点尽可能靠左排列。 换句话说,对于一个拥有 n 个节点的完全二叉树而言,它会按照从上到下、从左往右的方式填充节点位置直到不能再加为止[^2]。 #### 主要差异 两者之间主要存在以下几个方面的不同之处: - **结构特性**:在完美二叉树里,每层都被完全占据;而在完全二叉树中,只有前几层被完全占用,最后一层可以部分填充但需遵循左侧优先原则。 - **节点分布**:完美二叉树的所有叶节点均在同一水平线上;然而,在完全二叉树内,即使最后一层未达到最大容量,也允许存在更少数量的右侧分支。 - **应用场合**:由于其紧凑性和易于实现堆栈操作的特点,完全二叉树常用于构建高效的数据存储机制如堆(heap),而完美二叉树则更多地作为一种理论模型来帮助理解其他形式的二叉树性质。 ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def is_perfect_binary_tree(root: TreeNode) -> bool: if not root or (not root.left and not root.right): return True queue = [(root, 1)] depth = 0 while queue: node, level = queue.pop(0) if level > depth: depth += 1 if ((node.left and not node.right) or (not node.left and node.right)): return False if node.left: queue.append((node.left ,level + 1)) if node.right: queue.append((node.right, level + 1)) return all(n[1]==depth for n in queue) def is_complete_binary_tree(root: TreeNode) -> bool: if not root: return True nodes = [] current_level = [root] while any(node is not None for node in current_level): next_level = [] for node in current_level: if isinstance(node, TreeNode): nodes.append(node.val) if node.left: next_level.extend([node.left]) else: next_level.extend([None]) if node.right: next_level.extend([node.right]) else: next_level.extend([None]) elif node is None: break current_level = next_level[:] none_found = False for item in reversed(nodes): if item is None: none_found = True elif none_found: return False return True ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值