数据结构与算法-二叉树

本文深入探讨了二叉树的定义、性质、遍历方式及其与森林的转换关系,揭示了二叉树在数据结构中的核心地位。文章详细解释了满二叉树、完全二叉树的概念,介绍了二叉树的顺序存储和链式存储结构,以及遍历方法,包括先序、中序和后序遍历,并阐述了树、森林和二叉树遍历之间的联系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二叉树的定义

二叉树或为空树;或是由一个根结点加上两棵分别称为左子树和右子树的、互不交的二叉树组成。
在这里插入图片描述

满二叉树

指的是深度为k且含有2^k - 1个结点的二叉树。
在这里插入图片描述

完全二叉树

树中所含的 n 个结点和满二叉树中编号为 1 至 n 的结点一一对应。
在这里插入图片描述

二叉树的性质

  1. 在二叉树的第 i 层上至多有xi-1 个结点。(i≥1)
  2. 深度为 k 的二叉树上至多含 2k-1 个结点(k≥1)
  3. 对任何一棵二叉树,若它含有n0 个叶子结点、n2 个度为 2 的结点,则必存在关系式:n0 = n2+1
  4. 具有 n 个结点的完全二叉树的深度为⌊log2n⌋+1 (假设根结点的层次为1)
  5. 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
    (1) 若 i=1,则该结点是二叉树的根,无双亲,否则,编号为⌊i/2⌋ 的结点为其双亲结点。
    (2)若 2i>n,则该结点无左孩子, 否则,编号为 2i 的结点为其左孩子结点。若 2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。

二叉树的存储结构

顺序存储结构

顺序存储是用一组连续的存储单元存放数据,顺序存储要求数据是线性结构。二叉树是非线性结构,如何把二叉树转换为线性结构,而且保持结点之间的父/子关系?
满二叉树:从上到下,从左往右依次编号
在这里插入图片描述

在这里插入图片描述
一般的二叉树:想象成一个完全二叉树

在这里插入图片描述

在这里插入图片描述

链式存储结构
二叉链表

在这里插入图片描述
在这里插入图片描述

三叉链表

在这里插入图片描述

在这里插入图片描述

二叉树的遍历

  • 定义:顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。
  • 作用: 遍历的目的是线性化,使二叉树中的结点能够按照某种次序排列在一个线性队列上,便于处理。

线性结构的遍历,因为每个结点均只有一个后继,所以只有一条搜索路径。二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径进行遍历的问题。二叉树存在下述三条搜索路径:

  1. 先上后下的按层次遍历;
  2. 先左(子树)后右(子树)的遍历;
  3. 先右(子树)后左(子树)的遍历。

遍历方法参考:https://blog.youkuaiyun.com/ifwinds/article/details/83661676 树的遍历一节
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

森林和二叉树的关系

  • 树与二叉树的对应关系:给定一棵树,通过树的二叉链表表示法可以找到唯一的一棵二叉树与之对应。树的二叉链表的右子树一定是空的。
  • 森林与二叉树的对应关系:将森林中的第二棵树看成第一棵树的兄弟即可。
森林转换成二叉树
  • 转换规则
    若 F = Φ,则 B = Φ,否则,
    由 ROOT( T1 ) 对应得到Node(root);
    由 (t11, t12, …, t1m ) 对应得到 LBT;
    由 (T2, T3,…, Tn ) 对应得到 RBT。
    在这里插入图片描述
森林转换成二叉树示例
  1. 先将森林中的所有树转换成二叉树
    在这里插入图片描述

  2. 以第一棵二叉树的根为树根,将森林中所有的二叉树转换成一棵二叉树
    在这里插入图片描述

二叉树转换成森林
  • 转换规则
    若 B = Φ, 则 F = Φ,否则,
    由 Node(root) 对应得到 ROOT( T1 );
    由LBT 对应得到 ( t11, t12, …,t1m);
    由RBT 对应得到 (T2, T3, …, Tn)。
  • 转换步骤
    1)抹线:将二叉树中根结点与其右孩子连线,及沿右分支搜索到的所有右孩子间连线全部抹掉,使之变成孤立的二叉树
    2)还原:将孤立的二叉树还原成树
二叉树转换成森林示例
  1. 断开二叉树中右分支中搜索到的所有右孩子间的连线
    在这里插入图片描述

  2. 将得到的二叉树全部还原成树
    在这里插入图片描述
    由树、森林和二叉树的相互转换可知,树和森林的各种操作均可与二叉树的各种操作相对应。不过,和树对应的二叉树,其左、右子树的概念已改变为: 左子树是孩子,右子树是兄弟。

树、森林和二叉树遍历的关系

森林二叉树
先根遍历先序遍历先序遍历
后根遍历中序遍历中序遍历
树的遍历
  • 树的先根遍历:A B E F C D G,因此,树的先根遍历结果与其对应二叉树标示的先序遍历结果相同
  • 树的后根遍历:E F B C G D A,因此,树的后根遍历结果与其对应二叉树标示的中序遍历结果相同
    在这里插入图片描述
森林的遍历

在这里插入图片描述

  • 森林的先序遍历:
    若森林不空,则,
    1)访问森林中第一棵树的根结点;
    2)先序遍历森林中第一棵树的子树森林;
    3)先序遍历森林中(除第一棵树之外)其余树构成的森林。
    即:依次从左至右对森林中的每一棵树进行先根遍历。
    下图,森林的先序遍历结果为 A B C D E F G H I K J,因此,森林的先序遍历结果与其对应二叉树标示的先序遍历结果相同

  • 森林的中序遍历
    森林不空,则
    1)中序遍历森林中第一棵树的子树森林;
    2)访问森林中第一棵树的根结点;
    3)中序遍历森林中(除第一棵树之外)其余树构成的森林。
    即:依次从左至右对森林中的每一棵树进行后根遍历。
    下图,森林的中序遍历结果为 B C E D A G F K I J H,因此,森林的中序遍历结果与其对应二叉树标示的中序遍历结果相同

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值