快速学习二叉树的基本知识:性质、遍历、和应用
创作时间:
作者:
@小白创作中心
快速学习二叉树的基本知识:性质、遍历、和应用
引用
CSDN
1.
https://m.blog.csdn.net/2401_84009235/article/details/145596096
二叉树(Binary Tree)是计算机科学中一种重要的树形数据结构,广泛用于数据存储、搜索和排序等场景。我们从基本概念、性质、常见操作到具体实现逐步介绍。
1. 二叉树的基本概念
二叉树是一种特殊的树,每个节点最多只能有两个子节点,分别称为左子节点(Left Child)和右子节点(Right Child)。
分类
- 满二叉树(Full Binary Tree):所有节点要么是叶子节点,要么都有两个子节点。
- 完全二叉树(Complete Binary Tree):从上到下、从左到右依次填满的二叉树,可能最后一层不满,但一定是从左往右排列。
- 平衡二叉树(Balanced Binary Tree):任意节点的左右子树高度差不超过 1(如 AVL 树)。
- 二叉搜索树(Binary Search Tree, BST):满足左子树的所有节点 < 根节点 < 右子树的所有节点,便于快速查找。
2. 二叉树的基本性质
假设二叉树的深度为 hh,节点数为 nn,有以下性质:
- 节点数上限:满二叉树最多有 2h−12^h - 1 个节点。
- 叶子节点数:在满二叉树中,叶子节点个数等于非叶子节点个数加 1。
- 完全二叉树的特点:
- 叶子节点只可能出现在最后两层。
- 如果某个节点有右子节点,一定有左子节点。
3. 二叉树的遍历
遍历是二叉树的重要操作,分为深度优先遍历(DFS)和广度优先遍历(BFS)。
(1)深度优先遍历(DFS)
DFS 包括:
- 前序遍历(Preorder):根 → 左子树 → 右子树
- 中序遍历(Inorder):左子树 → 根 → 右子树
- 后序遍历(Postorder):左子树 → 右子树 → 根
递归实现(以 Python 为例):
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 前序遍历
def preorder_traversal(root):
if not root:
return []
return [root.val] + preorder_traversal(root.left) + preorder_traversal(root.right)
# 中序遍历
def inorder_traversal(root):
if not root:
return []
return inorder_traversal(root.left) + [root.val] + inorder_traversal(root.right)
# 后序遍历
def postorder_traversal(root):
if not root:
return []
return postorder_traversal(root.left) + postorder_traversal(root.right) + [root.val]
(2)广度优先遍历(BFS)
BFS 使用队列(Queue)进行层序遍历:
from collections import deque
def level_order_traversal(root):
if not root:
return []
result = []
queue = deque([root])
while queue:
node = queue.popleft()
result.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return result
4. 二叉搜索树(BST)
(1)BST 的特点
- 左子树所有节点小于根节点。
- 右子树所有节点大于根节点。
- 适合查找、插入和删除操作,平均时间复杂度 O(logn)O(\log n)。
(2)查找操作
def search_BST(root, val):
if not root or root.val == val:
return root
return search_BST(root.left, val) if val < root.val else search_BST(root.right, val)
(3)插入操作
def insert_BST(root, val):
if not root:
return TreeNode(val)
if val < root.val:
root.left = insert_BST(root.left, val)
else:
root.right = insert_BST(root.right, val)
return root
(4)删除操作
def delete_BST(root, val):
if not root:
return root
if val < root.val:
root.left = delete_BST(root.left, val)
elif val > root.val:
root.right = delete_BST(root.right, val)
else:
if not root.left:
return root.right
elif not root.right:
return root.left
temp = find_min(root.right) # 找右子树最小节点
root.val = temp.val
root.right = delete_BST(root.right, temp.val)
return root
def find_min(node):
while node.left:
node = node.left
return node
5. 平衡二叉树(AVL树)
二叉搜索树可能会变得倾斜,导致查找效率降低。AVL 树通过旋转操作(左旋、右旋)来保持平衡,保证查找操作的时间复杂度接近 O(logn)O(\log n)。
6. 二叉树的应用
- 哈夫曼树(Huffman Tree):用于数据压缩(如 Huffman 编码)。
- 二叉堆(Binary Heap):用于优先队列(如堆排序)。
- 表达式树(Expression Tree):用于计算表达式(如四则运算)。
- 红黑树(Red-Black Tree):一种自平衡二叉搜索树,用于数据库索引。
7. 练习题
基础题
计算二叉树的高度
判断二叉树是否为平衡二叉树
翻转二叉树(镜像)
进阶题
判断二叉搜索树是否合法
找二叉搜索树的最近公共祖先
实现二叉树的序列化和反序列化(LeetCode 297)
热门推荐
冬游桂林:山水如画,4天3晚玩转山水名城
3小时高铁直达,800元畅游桂林阳朔3天2晚
浙江男子使用疏通剂被烧伤,专家解析安全使用要点
青岛火车北站停车场升级:新增550个车位,优化交通流线
智能钥匙电池低电?教你快速搞定!
两大主会场、300场演出,第34届青岛啤酒节即将盛大开幕
青岛火车站:一座车站见证百年青岛发展史
煤的内在水分对燃烧效率的影响
煤炭贸易中的水分秘密
角钢理论重量计算:公式推导、实例计算与注意事项
从3mm到5mm:4号角钢规格与应用场景全攻略
高压输电塔架用4号角钢:理论重量计算与工程应用
景星岩山顶住宿,赏最美月色
别小看西兰花:心血管保护到眼睛保健的养生之道
一枕见文化:筷枕里的中国饮食礼仪与匠心
小鸡炖蘑菇:一道菜的百年传承与创新
1984春晚三大传奇:李谷一、马季、陈佩斯
建行活期存款利率降至0.1%,年内第六次下调助力经济回暖
砂锅番茄牛腩:家庭烹饪也能达到餐厅级美味
家有夫子传授番茄牛腩烹饪秘诀,1.5小时炖出暖心美味
新手也能做出完美番茄牛腩:从食材到成菜的全程指导
从烩饭到西式炖牛肉:番茄牛腩的三种创意家常菜
信息过载下的稀释效应:你真的看清楚了吗?
英德红茶:广东特产,三大红茶之一的冲泡与品鉴全攻略
英德红茶品牌价值超47亿,跃居全国红茶第二
“喜欢”和“爱”的区别,在这5个方面表现得淋漓尽致,你懂吗?
智能钥匙没电?CR2032电池救场!
智能钥匙没电?两种应急启动方法轻松解决
家庭教育与孩子的情绪调节技巧:管理情绪,促进和谐
江郎山、龙游石窟领衔,衢州十大景点详解