数据结构-树的详细介绍

目录

一.树的基本概念

二.树的存储结构

三. 树、森林、二叉树的转换

四.二叉树

4.1基本概念

特殊二叉树

4.2 二叉树存储结构

4.3 三种遍历实例(遍历代码,大家可以看王道书等其他书代码都类似)

4.4 常考结论

4.5 线索二叉树

4.6二叉树应用

4.7并查集

常考知识点


一.树的基本概念

树的定义

树的特点

  • 树是一种数据结构,它是由n个有限节点组成一个具有层次关系的集合
  • 每个节点有零个或多个子节点
  • 没有父节点的节点称为根节点
  • 每一个非根节点有且只有一个父节点
  • 除了根节点外,每个子节点可以分为多个不相交的子树

树的结构图

树的高度,深度,层

  • 节点的高度 = 节点到叶子节点的最长路径
  • 节点的深度 = 根节点到这个节点所经历的边的个数
  • 节点的层数 = 节点的深度 + 1

树的基本术语

树的性质

节点的度 :结点拥有的子树的数目

叶子 :度为零的结点 

分支结点 :度不为零的结点

树的度  :树中结点的最大的度

   层次:根结点的层次为1,其余结点的层次等于该结点的双亲结点的层次加1

   树的高度:树中结点的最大层次

   无序树:树中结点的各子树之间的次序是不重要的,可以交换位置

   有序树:树中结点的各子树之间的次序是重要的, 不可以交换位置

   森林:0个或多个不相交的树组成

  • 树的节点数 = 所有节点的度数之和 + 1
  • 度为m的树中第i层上最多有 m^{i-1}个结点
  • 已知度m和高度h

二.树的存储结构

双亲表示法

孩子表示法

孩子兄弟表示法

  • 采用一组连续空间来存储每个节点
  • 在每个节点中设置一个伪指针
  • 伪指针指示其双亲节点在数组中的位置
  • 将每个节点的孩子节点用单链表连接
  • 又叫二叉树表示法
  • 以二叉链表作为树的存储结构
  • 节点内容包含3个部分

【孩子节点】【数

据】【兄弟节点】

三. 树、森林、二叉树的转换

树和森林的遍历对应关系

森林

二叉树

先根遍历

先序遍历

先序遍历

后根遍历

中序遍历

中序遍历

四.二叉树

4.1基本概念

二叉树的定义

  • 二叉树是每个节点最多有两个子树的树结构
  • 它有五种基本形态【二叉树可以是空集】【根可以有空的左子树或右子树】【左、右子树皆为空】

二叉树的性质

  • 二叉树第i层上的节点数目最多为2^{i-1}
  • 深度为k的二叉树最多有 2^{k} 1个节点(满二叉树)
  • 包含n个节点的二叉树的高度至少为1og2(n + 1)
  • 树的节点数 = 所有节点的度数之和 + 1
  • 在任意一颗二叉树中,若终端节点的个数为 n0, 度为2的节点数为 n2, 则 n0 = n2 + 1

特殊二叉树

  • 高度为h,并且由 2^{h}-1个结点的二叉树
  1. 叶子结点只能出现在最下层和次下 层, 最下层的叶子结点集中在树的左部
  2. 一棵满二叉树必定是一棵完全二叉树
  3. 完全二叉树未必是满二叉树
  4. 完全二叉树中, 度为1的节点数 = 0个或者1个【计算时可以用这个快速计算, 配合n0 = n2 + 1

二叉查找树「二叉排序树」「二叉搜索树」

平衡二叉树

  1. 左子树节点比根节点值小
  2. 右子树节点比根节点值大
  3. 没有键值相等的节点
  • 树上任一结点的左子树和右子树的深度之差不超过1

4.2 二叉树存储结构

顺序存储结构

链式存储结构

定义

  • 一般用数组存二叉树的节点
  • 只要知道根节点的存储位 置,就可以通过下标计算,把整棵树串起来
  • 只要知道根节点,就可以通过左右子节点的指针把整棵二叉树串起来

特点

  • 节点x存储在下标为i的位置
  • 该节点的左节点存储在下标为2i的位置
  • 该节点的右节点存储在下标为2i+1的位置
  • 下标i/2的位置,存储的就是该节点的父节点
  • 空间利用率不高,容易造成空间浪费
  • 适用于:完全二叉树、满二叉树

  • 二叉链表中至少包含3个域
  • 「数据域data」「左指针域1chi1d」「右指针域rchi1d」
  • 适用于二叉树

4.3 三种遍历实例

(遍历代码,大家可以看王道书等其他书代码都类似)

4.4 常考结论

1、不能唯一确定一颗二叉树的是:先序序列和后序序列

2、先序遍历第一个节点为根节点;后序遍历最后一个节点为根节点

3、前序序列和中序序列的关系相当于以前序序列为入栈次序,以中序序列为出栈顺序

4、前序序列与后序序列刚好相反的时候,二叉树的高度 = 节点数(即每层只有一个节点)

5、后序遍历可以找到m到n直接的路径(其中m是n的祖先)

6、根据两个序列确定二叉树的方法

4.5 线索二叉树

基本概念

和参考点

  • 对一棵二叉树中所有节点的空指针域按照某种遍历方式加线索的过程叫作线索化
  • 线索二叉树是一种物理结构
  • 引入线索的目的是加快对二叉树的遍历
  • n个节点的线索二叉树上含有线索数量为n+1
  • 线索二叉树就是利用二叉树的n+1个空指针来存放节点的前驱和后继信息的
  • 后续线索二叉树不能有效解决求后续后继的问题,后续线索树的遍历仍需要栈的支持

结点结构

1tag=0,表示指向节点的左孩子

1tag=1,则表示1chi1d为线索,指向节点的直接前驱

rtag=0,表示指向节点的右孩子

rtag=1,则表示rchild为线索,指向节点的直接后继

中序线索化

的过程

                 

前序和后序线索化只需要把遍历方法改成前序和后序即可

4.6二叉树应用

(哈夫曼树详见有关哈夫曼树的基础知识和应用_哈夫曼树叶子结点与总结点的关系-CSDN博客)

4.7并查集

定义

例题

  • 并查集是一种简单的集合表示,支持3种操作
  • 并查集的存储结构是双亲表示法存储的树,主要是为了方便两个主要的操作

     

Initial(S)

Union(S,Root1,Root2)

Find(S,x)

  • 将集合S中的每个元素都初始化为只有一个单元素的子集合
  • 把集合S中的子集合 Root2并入子集合 Root1
  • 要求Root1和Root2互不相交,否则不执行

合并

  • 查找集合S中单元素x所在的子集合,并返回该子集合的根结点

void Initial(int S[])

{

for (int i = 0; i< size; i++)

S[i] = -1;

}

void Union(int S[], int Root1, int Root2)

{

S[Root2] = Root1;

}

int Find(int S[], int x)

{

while (S[x] >= 0)

x = S[x];

return x;

}

常考知识点

1、二叉树相关结论

【考试多用特殊值法】

二叉树
二叉树第i层上的节点数目最多为 i 1
包含n个节点的二叉树的高度至少为 n + 1
树的节点数 = 所有节点的度数之和 + 1
若终端节点的个数为 n , 度为 的节点数为n ,
n = n + 1
完全二叉树
度为1的节点数 = 个或者1个【计算时可以用这
个快速计算, 配合n = n + 1】
满二叉树
高度为h,并且由 h 1 个结点的二叉树

2、图的相关概念

常见术语

3、各种排序的比较

总结

4、查找常考结论

顺序查找、折半查找、分块查找

                                                                                          ----ssss

  • 13
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值