二叉树的定义
二叉树是每个节点最多只有两个子树的数结构,两个子树称为左子树和右子树
二叉树分类
- 满二叉树
(
F
u
l
l
(Full
(Full
B
i
n
a
r
y
Binary
Binary
T
r
e
e
)
Tree)
Tree)
也称为严格二叉树,是一种特殊的二叉树结构,具有以下严格性质- 每个节点要么有0个孩子(叶子节点),要么有 2 个孩子(不能只有1个子节点)
- 所有叶子节点都在同一层(树是完全平衡的)
关键性质
节点数量与高度的关系:
若树的高度为
h
h
h(根节点高度为0),则:
总节点数
=
2
h
+
1
−
1
=2^{h+1}-1
=2h+1−1
叶子节点数
=
2
h
=2^h
=2h
非叶子节点数
=
2
h
−
1
=2^h -1
=2h−1
数学递推关系:第
i
i
i层的最大节点数
=
2
i
= 2^i
=2i
示例图
1
/ \
2 3
/ \ / \
4 5 6 7
//满二叉树
- 完全二叉树
(
C
o
m
p
l
e
t
e
(Complete
(Complete
B
i
n
a
r
y
Binary
Binary
T
r
e
e
)
Tree)
Tree)
满足以下条件:- 所有层(除最后一层)都完全填满(即节点数达到最大值)
- 最后一层的节点必须从左到右连续排列,不允许中间有空缺
关键性质
节点编号关系(假设根节点编号为1):
对于第
i
i
i个节点:
左孩子:
2
i
2i
2i
右孩子:
2
i
+
1
2i+1
2i+1
父节点:
⌊
i
/
2
⌋
⌊i/2⌋
⌊i/2⌋(向下取整)
高度与节点数:
若树高为
h
h
h:
最少节点数
=
2
h
(
前
h
−
1
层满
+
第
h
层至少
1
个
)
=2^h(前h-1层满+第h层至少1个)
=2h(前h−1层满+第h层至少1个)
最多节点数
=
2
(
h
+
1
)
−
1
(
满二叉树
)
=2^{(h+1)}-1(满二叉树)
=2(h+1)−1(满二叉树)
与满二叉树的区别:
满二叉树是所有层都填满,其节点数严格为
2
h
−
1
2^{h-1}
2h−1
完全二叉树是最后一层可以不满,但必须靠左排列
示例图
1
/ \
2 3
/ \ /
4 5 6
//完全二叉树
- 二叉搜索树
(
B
i
n
a
r
y
(Binary
(Binary
S
e
a
r
c
h
Search
Search
T
r
e
e
Tree
Tree)
二叉搜索树是一种有序的二叉树,具有高效的查找、插入和删除操作
(平均时间复杂度 O ( l o g n ) O(log n) O(logn)
满足的条件:- 左子树的所有节点值 < < <根节点值
- 右子树的所有节点值 > > >根节点值
- 左右子树也必须是二叉搜索树(递归定义)
核心操作
1.查找
(
S
e
a
r
c
h
)
(Search)
(Search)
从根节点开始,比较目标值:
若目标值
=
=
==
==当前节点值
→
→
→找到
若目标值
<
<
<当前节点值
→
→
→递归查左子树
若目标值
>
>
>当前节点值
→
→
→递归查右子树
时间复杂度:
平均
O
(
l
o
g
n
)
O(log n)
O(logn)(平衡时)
最差
O
(
n
)
O(n)
O(n)(退化成链表时)
2.插入
(
I
n
s
e
r
t
)
(Insert)
(Insert)
类似查找,找到空位插入新节点:
若树为空
→
→
→新节点为根
否则,递归找到合适的位置插入
3.删除
(
D
e
l
e
t
e
)
(Delete)
(Delete)
删除分三种情况:
若是叶子节点:直接删除
若只有一个子节点:用子节点替换它
若有两个子节点:
找到其右子树的最小节点(或左子树的最大节点)替换它
然后递归删除那个最小/最大节点
示例图
4
/ \
2 6
/ \ / \
1 3 5 7
//二叉搜索树
- 平衡二叉树
(
B
a
l
a
n
c
e
d
(Balanced
(Balanced
B
i
n
a
r
y
Binary
Binary
T
r
e
e
)
Tree)
Tree)
(
又称
A
V
L
树
)
(又称AVL树)
(又称AVL树)
A V L 树 AVL树 AVL树是一种自平衡二叉搜索树,通过旋转操作保持树的平衡,确保查找、插入、删除的最坏时间复杂度为 O ( l o g n ) O(log n) O(logn)
1.平衡因子 ( B a l a n c e (Balance (Balance F a c t o r ) Factor) Factor)
定义:平衡因子 = = =左子树高度 − - −右子树高度
合法范围: − 1 ≤ -1≤ −1≤平衡因子 ≤ 1 ≤1 ≤1
失衡情况:
①平衡因子 > 1 → >1→ >1→左子树更高(需要右旋或左右旋)
②平衡因子 < − 1 → <-1→ <−1→右子树更高(需要左旋或右左旋)
| 失衡情况 | 旋转方式 | 示例 |
|---|---|---|
| 左子树高(LL型) | 右旋(Right Rotate) | A(left) → B → B(root) → A |
| 右子树高(RR型) | 左旋(Left Rotate) | A → B(right) → B(root) ← A |
| 左子树的右子树高(LR型) | 先左旋后右旋 | 先处理左子树,再右旋 |
| 右子树的左子树高(RL型) | 先右旋后左旋 | 先处理右子树,再左旋 |
参考 D e e p S e e k , 刚熟悉不久 , 讲的没 D e e p S e e k 的好 参考DeepSeek,刚熟悉不久,讲的没DeepSeek的好 参考DeepSeek,刚熟悉不久,讲的没DeepSeek的好
- AVL树 在 插入/删除 时自动调整平衡,确保高效查找
- 四种旋转(左旋、右旋、左右旋、右左旋)处理不同失衡情况
- 时间复杂度:
- 查找: O ( l o g n ) O(log n) O(logn)(最坏情况仍平衡)
- 插入/删除: O ( l o g n ) O(log n) O(logn)(旋转操作是 O(1))
二叉树的遍历
- 方法
-
前序遍历先访问根节点,然后前序遍历左子树,再前序遍历右子树
-
中序遍历从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树
-
后序遍历从左到右先叶子节点后父节点的方式遍历访问左右子树,最后是访问根节点
以下是一个普通二叉树的结构,节点标记为 A, B, C, D, E, F, G,并展示其 前序、中序、后序 遍历结果。
二叉树结构
A
/ \
B C
/ \ / \
D E F G
//(默认前序)
//根:A
//左子树B->D->E
//右子树C->F->G
遍历结果
| 遍历方式 | 顺序 | 解释 |
|---|---|---|
| 前序遍历 | A → B → D → E → C → F → G | 根 → 左 → 右(先访问根节点) |
| 中序遍历 | D → B → E → A → F → C → G | 左 → 根 → 右(升序输出,若为BST) |
| 后序遍历 | D → E → B → F → G → C → A | 左 → 右 → 根(最后访问根节点) |
关键点总结
- 前序遍历:用于复制树结构(根最先访问)
- 中序遍历:在BST中可得到有序序列
- 后序遍历:用于安全删除树(根最后访问)
例题补充
题单推荐 题单推荐 题单推荐
洛谷题单 洛谷题单 洛谷题单 - 二叉树
~ 完结撒花 完结撒花 完结撒花 ~
附:文章主要参考理论
推荐
洛谷
洛谷
洛谷作为你的刷题区域
文章有
D
e
e
p
S
e
e
k
DeepSeek
DeepSeek参与
作者:
二叉树的代码丢失了qwq
改天找到了在更新加进来
抱歉抱歉抱歉,2天之内更新例题!!


1万+

被折叠的 条评论
为什么被折叠?



