| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> (Java)数据结构之树与二叉树(二叉树的四种遍历,获取结点个数,获取叶子结点个数,获取高度,获取第k层结点个数,查找值为val的结点,判断一棵树是否为完全二叉树(详述,图文并茂) -> 正文阅读 |
|
[数据结构与算法](Java)数据结构之树与二叉树(二叉树的四种遍历,获取结点个数,获取叶子结点个数,获取高度,获取第k层结点个数,查找值为val的结点,判断一棵树是否为完全二叉树(详述,图文并茂) |
目录 1. 树形结构1.1 树的概念树是一种非线性的数据结构,它是由n个(n>=0)个有限节点组成一个具有层次关系的集合。它的形状像一颗倒挂的树,根在上,叶在下。 特点: · 有一个特殊的结点称为根节点,根节点没有前驱结点 · 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1,T2,.....,Tm,其中每一个集合又是一颗与树类似的字树。每棵子树的根节点有且只有一个前驱,可以没有或者多个后继 · 树是递归定义的 注意:在树形结构中,子树不能有交集,否则就不是树形结构 重要概念: 结点的度:一个结点含有子树的个数 树的度:所有结点的度的最大值称为树的度 叶子结点或终端结点:度为0的结点 双亲结点或父亲结点:若一个结点含有子节点,则这个结点为其子结点的双亲结点 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点 根结点:树中没有双亲结点的结点 结点的层次:从根开始定义,根为第一层,根的子结点为第二层,以此类推 树的高度或深度:树中结点层次的最大值 森林:由m(m>0)棵互不相交的树组成的集合称为森林 1.2 树的表示形式(简单了解)树的结构相对于线性表比较复杂,要存储起来也比较麻烦,这里有几种表示方法:双亲表示法,孩子表示法,孩子双亲表示法,孩子兄弟表示法等,这里只简单了解最常用的孩子兄弟表示法。
2. 二叉树(重点)2.1 概念一颗二叉树是结点的一个有限集合,该集合: 1. 为空 2. 由一个结点加上两颗别称为左子树和右子树的二叉树组成 从图中可以看出: 1. 二叉树不存在度大于2的结点 2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树 注意:对于任意的二叉树都是由以下几种情况复合而成的: 这里展示一张照片---大自然的奇观:现实中的二叉树 2.2 两种特殊的二叉树1. 满二叉树:一颗二叉树,如果每层的节点数都达到最大值,则这棵二叉树就是满二叉树 2.完全二叉树:它是一种效率很高的数据结构,完全二叉树是由满二叉树引出来的。对于深度为k,有n个结点的二叉树,当且仅当每一个结点都与深度为k的满二叉树中编号从0至n-1的结点一一对应时称之为完全二叉树,满二叉树是一种特殊的完全二叉树
2.3 二叉树的性质(重点,选择题常考)1. 规定根结点的层数是1,则一颗非空二叉树的第i层上最多2^(i-1)个结点 2. 规定只有根结点的二叉树深度为1,则深度为k的二叉树的最大结点数是2^k - 1 3. 对于任何一颗二叉树,如果其叶结点个数为n0,度为2的结点个数为n2,则n0=n2+1 4. 具有n个结点的二叉树的深度为log2(n+1)向上 取整 , 5. 对于有n个结点的完全二叉树,如果按照从左至右,从上往下的顺序对所有结点从0开始编号,则对于序号为i的结点有: · 若i>0,双亲序号:2i+1;i=0,i为根节点编号,无双亲结点 · 若2i+1<n,左孩子序号:2i+1,否则无左孩子 · 若2i+2<n,右孩子序号:2i+2,否则无右孩子 2.4?二叉树的链式存储二叉树的链式存储是通过一个一个的结点引用起来的,常见的表示方法有二叉和三叉表示方式,具体如下:
2.5 二叉树的基本操作2.5.1 前提说明从图结合概念可以看出,二叉树是递归定义的,后面基本操作都是按照该概念实现的? 我们需要先创建一颗二叉树,这里手动快速创建一颗简单的二叉树:
注意:上述代码不是创建二叉树的方式,创建二叉树后面会介绍 2.5.2 二叉树的遍历1. 前中后序遍历? 遍历就是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,访问结点所做的操作依赖于具体的应用问题(比如:打印结点内容),遍历是二叉树最重要的操作之一,是二叉树上进行其他运算的基础。 N代表根结点,L代表根结点的左子树,R代表根节点的右子树,则根据遍历根节点的先后次序有以下几种遍历方式: NLR:前序遍历:根节点---根的左子树---根的右子树 LNR:中序遍历:根的左子树---根结点---根的右子树 LRN:后序遍历:根的左子树---根的右子树---根结点? 前序遍历结果:1 2 3 4 5 6 中序遍历结果:3 2 1 5 4 6 后序遍历结果:3 2 5 6 4 1? 2. 层序遍历 除了上述三种遍历,还可以对二叉树进行层序遍历。根节点所在的层数为第一层,自上到下,自左到右,逐层访问树的结点的过程就是层序遍历? 2.5.3 二叉树基本操作的实现(重点)1. 二叉树的前中后序遍历:采用递归的方式遍历
2. 二叉树的层序遍历:这里需要借助队列完成
图解:图比较丑,但是能说明情况 3. 获取二叉树中结点的个数 二叉树结点的个数=根的左子树结点的个数+根的右子树结点的个数+1(这个1就是根),所以直接一个递归就解决问题了
4. 获取二叉树中叶子结点的个数 叶子结点就是该结点的左子树为空,右子树为空,所以当遇到此节点时返回1,递归返回所有该结点的总数
5. 获取二叉树中第k层结点的个数
6. 获取二叉树的高度 将此二叉树的左子树的高度与右子树的高度进行比较,较大的高度+1就是此二叉树的高度
7. 查找值为val的结点并返回 先递归在左子树中找,再递归在右子树中找?
8. 判断一棵树是否为完全二叉树(重点,常考) 当某个结点是叶子结点时,此结点必须没有左右子树,如果有则返回false;当某个结点是其父类左子树的根且该结点只有左子树时,该结点同一层的另一个结点必须没有子树,否则返回为false 第一种情况好理解,这里将第二种情况进行画图说明: 注意:当遇到上述两种情况时,必须得进行特殊检测 检测的方法:当满足上面两种情况时,待检测的结点有左子树或者右子树其中的一个子树则返回false(结合上图更容易理解)
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 | -2025/1/9 1:04:46- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |