C++数据结构·二叉树

二叉树的定义

二叉树是每个节点最多只有两个子树的数结构,两个子树称为左子树和右子树

二叉树分类

  • 满二叉树 ( F u l l (Full (Full B i n a r y Binary Binary T r e e ) Tree) Tree)
    也称为严格二叉树,是一种特殊的二叉树结构,具有以下严格性质
    1. 每个节点要么有0个孩子(叶子节点),要么有 2 个孩子(不能只有1个子节点)
    2. 所有叶子节点都在同一层(树是完全平衡的)

关键性质
节点数量与高度的关系:
若树的高度为 h h h(根节点高度为0),则:
总节点数 = 2 h + 1 − 1 =2^{h+1}-1 =2h+11
叶子节点数 = 2 h =2^h =2h
非叶子节点数 = 2 h − 1 =2^h -1 =2h1
数学递推关系:第 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. 所有层(除最后一层)都完全填满(即节点数达到最大值)
    2. 最后一层的节点必须从左到右连续排列,不允许中间有空缺

关键性质
节点编号关系(假设根节点编号为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(h1层满+h层至少1)
最多节点数 = 2 ( h + 1 ) − 1 ( 满二叉树 ) =2^{(h+1)}-1(满二叉树) =2(h+1)1(满二叉树)
与满二叉树的区别:
满二叉树是所有层都填满,其节点数严格为 2 h − 1 2^{h-1} 2h1
完全二叉树是最后一层可以不满,但必须靠左排列

示例图

       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. 左子树的所有节点值 < < <根节点值
    2. 右子树的所有节点值 > > >根节点值
    3. 左右子树也必须是二叉搜索树(递归定义)

核心操作
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) → BB(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的好

  1. AVL树插入/删除 时自动调整平衡,确保高效查找
  2. 四种旋转(左旋、右旋、左右旋、右左旋)处理不同失衡情况
  3. 时间复杂度:
    • 查找: O ( l o g n ) O(log n) O(logn)(最坏情况仍平衡)
    • 插入/删除: O ( l o g n ) O(log n) O(logn)(旋转操作是 O(1))

二叉树的遍历

  • 方法
  1. 前序遍历先访问根节点,然后前序遍历左子树,再前序遍历右子树

  2. 中序遍历从根节点开始(注意并不是先访问根节点),中序遍历根节点的左子树,然后是访问根节点,最后中序遍历右子树

  3. 后序遍历从左到右先叶子节点后父节点的方式遍历访问左右子树,最后是访问根节点

以下是一个普通二叉树的结构,节点标记为 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左 → 右 → 根(最后访问根节点)

关键点总结

  1. 前序遍历:用于复制树结构(根最先访问)
  2. 中序遍历:在BST中可得到有序序列
  3. 后序遍历:用于安全删除树(根最后访问)

例题补充

例题补充 例题补充 例题补充

题单推荐 题单推荐 题单推荐

洛谷题单 洛谷题单 洛谷题单 - 二叉树

~ 完结撒花 完结撒花 完结撒花 ~

附:文章主要参考理论
推荐 洛谷 洛谷 洛谷作为你的刷题区域
文章有 D e e p S e e k DeepSeek DeepSeek参与

作者:
二叉树的代码丢失了qwq
改天找到了在更新加进来
抱歉抱歉抱歉,2天之内更新例题!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值