首页 > 编程语言 >数据结构与算法——树与二叉树

数据结构与算法——树与二叉树

时间:2024-10-28 15:16:06浏览次数:9  
标签:结点 子树 右子 算法 二叉树 数据结构 树中 分支

树与二叉树

1.树的定义与相关概念

树的示例:

树的集合形式定义

Tree=(K,R)

元素集合:K={ki|0<=i<=n,n>=0,ki∈ElemType}(n为树中结点数,n=0则树为空,n>0则为非空树)

对于一棵非空树,关系R满足下列条件:

1.有且仅有一个结点没有前驱,称为根结点。

2.处根结点外,其余每个结点有且仅有一个前驱。

3.每个结点(包括根),可以有任意多个(含0个)后继。

树的递归形式定义

树是由n(n>=0)个元素构成的有限集合。

任意一颗非空树,都满足:

1.有且仅有一个根节点。

2.其余结点被分成m(m>=0)个

3.互不相交的有限集T1,T2,...Tm,其中每一个集合Ti(1<=i<=m)又是一颗树(递归),称为根的子树。

树结构反映了元素间的层次关系,分类分级的问题都可以考虑用树来描述。

树的基本术语——1

结点的度:结点所拥有的子树的个数

树的度:树中所有结点的度的最大值

叶结点:度为的结点。

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

孩子结点和双亲结点:在一颗树中,每个结点的后继,被称为该结点的孩子结点,相应地,该结点被称为孩子结点地双亲结点。

兄弟结点:具有同一双亲的孩子结点。

树的基本术语——2

结点的祖先:该结点所经分支上的所有结点都称为该结点的祖先。

结点的子孙:以某节点为根的子树中的任一结点。

 结点的层次:树是一种层次结构,树中的每个结点都处于某个层次上。

树的深度:树中所有结点层次的最大值,也成为树的高度

树的基本术语——3

有序树:树中的各结点的子树是按照从左到右有序排序的,即各子树的位置不能交换

无序树:树中各结点的子树排序是无序的。

森林:m(>=0)颗互不相交的树的集合。

2.二叉树的定义

二叉树:每个结点最多有两棵子树的有序树

二叉树或者是一棵空树,或者是一棵由一个根节点和两棵互不相交的分别称做根的左子树和右子树组成的非空树,左子树和右子树同样是一颗二叉树。

注意:

二叉树的只能是012

二叉树是有序树,它的左、右子树是有次序的,即使只有一棵子树也要区分是左子树还是右子树。

3.满二叉树与完全二叉树

满二叉树:二叉树的所有分支结点都有左子树和右子树,并且所有叶子结点都在二叉树的最下一层

完全二叉树:具有n个结点的完全二叉树,它的结构与满二叉树的前n个结点结构相同

4.二叉树的性质

性质1:非空二叉树上的叶结点数等于双分支结点数加1.即:n0=n2+1

证明:

设n0,n1,n2分别代表度为0,1,2的结点的个数,则结点总数n=n0+n1+n2

除根结点以外,每个结点上层都有一个分支与之相连,因此,具有n个结点的二叉树的额分支总数为B=n-1

这些分支来自度为1和度为2的结点,因此,分支总数B=n1+2n2

由上述三个式子得出:n0=n2+1

性质2:非空二叉树的第i(i>=1)层上最多有2的i-1次方个结点。

性质3:深度为h(h>=1)的非空二叉树最多有2的h次方-1个结点

性质4:具有n(n>0)个结点的完全二叉树的深度:h=[log2的n次方]+1

性质5:n个结点的完全二叉树,按从上至下,从左至右的次序对结点编号,则编号为i的结点有以下性质:

1、若编号为i的结点满足:i<=[n/2],即2i<=n.则该结点为分支结点,否则为叶子结点。

2、若n为奇数,则每个分支结点既有左孩子又有右孩子;

3、若n为偶数,则编号最大的分支结点(编号为n/2)只有左孩子,没有右孩子,其余分支结点都有左、右孩子。

示例:已知一棵完全二叉树的第6层有7个结点,则:

前5层为满二叉树,共有结点2的5次方-1=31,第6层7个结点,总结点数为31+7=38.

由于完全二叉树最后一层的结点必须从左至右连续出现,所以 第6层的7个结点中,只有最后一个结点的双亲是度为1的结点,即度为1的结点有1个。

5.二叉树的顺序存储结构

在一组连续的存储单元中,按照完全二叉树中结点编号将结点自上而下、自左至右的顺序存储。

元素的位置序号和结点的编号相对应,即结点在数组中的位置表示了结点之间的关系:

1、结点编号为i,则:

2、结点i的双亲结点[i/2]

3、结点i的左子结点2i,右子结点2i+1

非完全二叉树 的存储方法:

6.二叉树的链式存储结构

二叉树结点类型:

typedfe struct node{
    ElemType data;//数据域
    struct node *left;
    struct node *right;//结点的左右子树指针
}BTNode;//二叉树结点类型

一个二叉链表由根指针root唯一确定。

若二叉树为空,则root=NULL;

若结点的某个孩子不存在,则相应的指针为空。 

三叉链表:根据实际问题的需要,还可以在结点中添加父结点的指针。

7.逻辑关系与存储结构

标签:结点,子树,右子,算法,二叉树,数据结构,树中,分支
From: https://blog.csdn.net/2301_80888963/article/details/143252291

相关文章

  • 算法学习笔记3:图论
    图论拓扑序列有向无环图一定存在拓扑序列,通过入度为0来判断该点是否可以加入队列。强连通分量定义:在有向图G中,如果两个顶点u,v间有一条从u到v的有向路径,同时还有一条从v到u的有向路径,则称两个顶点强连通。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向非强连通图......
  • 算法学习笔记1:数据结构
    数据结构并查集一种树形的数据结构,近乎O(1)的时间复杂度。又一次理解了并查集用来维护额外信息的作用,可以用来记录集合中的元素个数,也可以维护节点到根节点之间的距离,可能还有别的,然后在进行路径压缩的时候修改需要维护的额外信息。主要构成pre[]数组、find()、join()......
  • 算法学习笔记2:搜索
    搜索BFS我的理解:基础的bfs本质上也是动态规划,dist[i,j]表示到达(i,j)转移的最小次数。由于动态规划的无后效性,就是当前状态确定后,不需要管之前的状态转移。bfs是一层一层搜的,搜索的相当于是一个状态,第一个搜到的就是最优的。比如最简单的走迷宫,每个点只会走一次,那么第一......
  • 机器学习中的算法—背包问题
    原文链接:机器学习中的算法—背包问题–每天进步一点点背包问题是一种资源分配算法,是一种非常典型的问题,是对资源分配最大化的体现。倘若有n件物品,其中每件物品都有属于自己的质量和价值,现在仅有一个背包,但是背包最大的承载量为w,因此需要试图在这个背包里装一些物品,使得物品的......
  • 【计算机专业毕设选题推荐】基于协同过滤算法的的儿童图书推荐系统的设计与实现 【附
    ✍✍计算机编程指导师⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java实战|SpringBoot/SSMPython实战项目|Django微信小程......
  • 紫微斗数算法的实现流程
    题外话我想了又想大凡能够修炼成绝世高手的都是“魔鬼”。只有魔鬼才会纯粹的“敢贪,敢嗔,敢痴”。你我都困在了敢字。程序猿拿起拿锋利的刀,解构世间的一切吧!最近看西游有感而发。“联系是普遍存在的,规律是客观存在的”,那能不能用程序来解构命运的客观存在?那就来试试吧!​ 紫微......
  • SMO算法 公式推导
    ......
  • 代码随想录算法训练营第十一天|leetcode150. 逆波兰表达式求值、leetcode239. 滑动窗
    1leetcode150.逆波兰表达式求值题目链接:150.逆波兰表达式求值-力扣(LeetCode)文章链接:代码随想录视频链接:栈的最后表演!|LeetCode:150.逆波兰表达式求值_哔哩哔哩_bilibili自己的思路:这是一道有思路,但是思路并不多的题目,就是我会觉得是先将数据进行添加,然后对于符号通过倒......
  • 100种算法【Python版】第15篇——KMP算法
    本文目录1算法原理1.1部分匹配表2实现步骤3示例说明4python实例5算法应用领域1算法原理KMP(Knuth-Morris-Pratt)算法是一种用于高效字符串匹配的算法。它通过预处理模式字符串,构建一个部分匹配表(前缀函数),以避免重复比较,从而提高匹配效率。KMP算法通......
  • Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏
    前文:模拟器运行环境及Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏SuperMario_GeneticEvolution_Neat项目介绍:模拟器运行环境及Lua代码——使用遗传进化算法(neat算法)玩超级玛丽游戏代码地址:https://openi.pcl.ac.cn/devilmaycry812839668/SuperMario_GeneticEvol......