数据结构——树和森林

本文深入探讨了树的数据结构,包括树的定义、基本术语、性质以及森林的概念。重点讲解了二叉树的类型,如满二叉树、完全二叉树和二叉排序树,并介绍了二叉树的存储结构和遍历方法。此外,还讨论了树和二叉树之间的转换以及森林与二叉树的转换。最后,通过实例解析了如何根据遍历序列重建二叉树,并给出了相关考试题目的解答。

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

思维导图

在这里插入图片描述

树是一种逻辑结构
树是n个结点的有限集合,n=0时,称为空树,任意的非空树满足一下要求:
1)有且仅有一个特定的称为根的结点。
2)当n>1时,其余结点可分为m个互不相交的有限集合,其中每个集合本身又是一棵树,称为根结点的子树,n个结点的树只有n-1条边
3)树个根节点没有前驱结点,除了根节点以外的所有结点都有且仅有一个前驱结点
4)数中的结点有多个或者0个后继结点

树的基本术语

在这里插入图片描述
祖先结点,子孙结点,双清结点:k结点,根结点A到K的唯一路径上的任意结点(A,B,E),都是k结点的祖先结点,k是它们的子孙结点,而离k最近的祖先结点E,可称为双亲结点,根结点A是唯一一个没有双亲结点的,拥有共同双亲结点的结点称之为兄弟结点,如K,L
:树中一个结点的孩子结点个数称之为该节点的度。如B的度为2,D的度为3,数的度:树种最大度数为树的度如图为3
分支结点:度大于0的结点
子结点:度等于0的结点
结点层次:如图根节点为第一层,根结点的子节点为第二层,依次向下,如图
结点的深度:是从根节点开始自顶向下累加的
结点的高度:是从叶结点开始自下向上累加的
数的高度和深度是树种结点的最大层数
有序树指树的结点从左到右是有序的,不能任意更换,无序树是指结点从左到右没有规律,可以互换
路径和路径长度:数的路径是由两个结点之间经过的结点序列,而路径长度是指这个序列的长度,树的路径长度是从根结点到每个结点路径长度的总和。
森林:森林是m颗互不相交的数的集合。

树的性质

树中结点数等于所有结点的度数加1
度为m的树中第i层上至多有mi-1 个结点
高度为h的m叉树至多有(mh -1)/(m-1)个结点
具有n个结点的m叉树的最小高度为log (n(m-1)+1,m)取上限

二叉树

定义:有左孩子和右孩子的树
不同孩子的二叉树不为同一个二叉树,一颗两层的二叉树有5中情况

特殊的二叉树

满二叉树

只有度为2的结点和叶子结点组成的二叉树。高度为h则含有2h -1个结点。从上至下,从左至右编号,双亲结点的编号为孩子结点编号除以二取上限。
在这里插入图片描述

完全二叉树

按照满二叉树的编号方式,编号不能间断的二叉树
在这里插入图片描述

二叉排序树(二叉搜索树)

所有结点大于左孩子小于右孩子的二叉树
在这里插入图片描述
传送门——详细内容

平衡二叉树

任意结点的左孩子和右孩子深度之差不超过1
在这里插入图片描述
传送门——详细内容

二叉树的性质

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

二叉树的存储结构

顺序存储

根据完全二叉树的性质左孩子2i,右孩子为2i+1,顺序表示每个结点的关系
在这里插入图片描述

链式存储

一个结点定义两个指针域分别指向左孩子和右孩子
在这里插入图片描述
在这里插入图片描述

二叉树的遍历

先序遍历

时间复杂度O(n)
先序遍历

中序遍历

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

后序遍历

在这里插入图片描述

层次遍历

出队一个元素压入此元素的左孩子和右孩子
在这里插入图片描述
在这里插入图片描述

由遍历序列构造二叉树

后序和中序,前序和中序,层次和中序可以构造出二叉树,前序和后序不可以确定一颗二叉树

线索二叉树

线索化
若无左子树,则将左指针指向其前驱结点,若无右子树,则将指针指向后继结点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按照普通的链式存储是无法判断指向的是左孩子还是前驱结点,无法判断是右孩子还是后继结点,所以就要添加一个标志位进行判断

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

在这里插入图片描述

树的存储结构

双亲表示法

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

孩子表示法

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

孩子兄弟表示法

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

三种表示法的有优缺点

在这里插入图片描述

树和二叉树

数和二叉树的转换

在这里插入图片描述

左指针指向孩子结点,右指针指向兄弟结点
在这里插入图片描述
在这里插入图片描述
二叉树向数的转变为逆过程
在这里插入图片描述

森林转换为二叉树

把森林中的所有树转换为二叉树,然后每颗二叉树的根作为上一颗二叉树的右子树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二叉树返回森林为逆过程

树和森林的遍历

树的遍历

先根遍历 后根遍历 层次遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

森林的遍历

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

真题

2015:
先序序列为abcd的不同二叉树的个数是
根据二叉树前序序列和中序序列的递归算法中递归工作栈的状态变化得出,前序序列和中序序列的关系相当于以前序序列为入栈次序以中序序列为出栈次序,因为前序序列和中序序列可以唯一的确定一颗二叉树,所以题意相当于是abcd入栈,则出栈序列为多少个,对于n个不同元素进栈,出栈序列的个数为Cn2n/n+1个 14个

2011:
若先序遍历和后序遍历刚好相反,这个二叉树一定是一个高度为n的二叉树(一条线,没有分支),所以他的根节点一定是在最后一个或者第一个,同样先序序列的第二个结点一定是在,除去根节点之后剩下的二叉树中,第一个或者最后一个,比如先序序列是1234,后序序列是4321,那么中序序列中1一定是第一个或者最后一个,除去第一个结点之后,先序序列的第二个结点2,在中序序列中一定是在剩下的结点234中,排在第一个或者最后一个。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值