| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 图解剖析,递归思想,使用二叉链建立一个二叉树并实现相关操作(数据结构) -> 正文阅读 |
|
[数据结构与算法]图解剖析,递归思想,使用二叉链建立一个二叉树并实现相关操作(数据结构) |
在建立一个简单的二叉树之前,我们需要了解二叉树的特点与性质。 二叉树的特点: ????????1.二叉树不存在度大于2的结点。 ????????2.二叉树是有序树,二叉树的子树有左右之分,次序不能颠倒。 ????????3.空树也是二叉树,二叉树由一个根节点和两颗分别叫做左子树和右子树的二叉树构成。 对于任意二叉树,都是由以上几种情况复合而成。 ?二叉树的储存结构: ????????1.顺序结构,一般比较适合完全二叉树。 ????????2.链式结构,用一个链表来表示一颗二叉树,用链来表示结点之间的逻辑关系。 ????????我们则选择使用较为通用的链式结构,链式结构分为二叉链和三叉链,我们选择使用较为简单的二叉链。 用二叉链表示一个二叉树:
?????????在初期,我们可以快速创建一个如图的简单二叉树,待完全掌握其结构时,再研究二叉树的真正创建方式。
????????这样我们就创建了一个简单的二叉树,此后我们会在此二叉树的基础上完成一系列基本操作。 一、二叉树的遍历????????二叉树的遍历时按照某种和规则,依次对二叉树中的结点进行处理,且每个结点只处理一次。 ????????二叉树的遍历规则有:前序遍历,中序遍历和后序遍历。 ????????前序遍历:访问根结点的操作发生在遍历其左右子树之前。(根>左>右) ????????中序遍历:访问根结点的操作发生在遍历其左右子树之中。(左>根>右) ????????后序遍历:访问根结点的操作发生在遍历其左右子树之后。(左>右>根)
???????? ?????????我们可以把问题分解成:遍历根节点以及根节点的两个子树,即可以用递归的思想解决。 首先解决前序遍历:
????????中序序遍历我们只需先遍历左子树,再遍历根结点,最后遍历右子树; ????????同理,后序遍历则是先遍历左子树和右子树,最后遍历根结点。
二、二叉树结点个数以及高度等
????????经过前面对遍历算法的实现,我们发现,二叉树的问题可以使用递归思想解决。 1.二叉树结点个数: ????????二叉树的结点个数就等于根结点个数(1)加上其左右子树的节点个数。
2.二叉树的叶子结点个数 ????????自身下面不再链接有结点的结点叫做叶子结点,即度为0的结点;同样我们可以把问题分解成 :二叉树的叶子结点数就等于二叉树的左右子树的叶子结点数之和。
3.求二叉树的高度; ????????相同的递归思想:二叉树的高度等于其左右子树中更高的子树的高度加1。
4.二叉树第k层结点的个数 ????????首先,k不能小于等于0,其次,我们可以将问题分解为求二叉树子树的第k-1层的结点个数。 当k==1时,相当于求子树的根节点有几个,直接返回1;
5.寻找二叉树内值为x的结点。 ????????依旧是递归思想,寻找二叉树内值为x的结点也就是看根节点是否是值为x的结点和查找子树中有无值为x的结点;
????????先找根结点是否值为x,再找左子树中有无值为x的结点,如果没有返回NULL;最后找右子树中有无值为x的结点。 三、二叉树的创建和销毁????????经过前面对二叉树的各项操作,相信大家已经较为充分的理解了二叉树的结构。下面我们来看看究竟如何创建一个二叉树。
1.创建二叉树。 ????????我们可以尝试按照前序遍历的顺序创建一个二叉树;首先可以让用户提供一个数组。
????????我们按前序遍历尝试创建二叉树,先写一个创建新结点的函数;
????????创建一个二叉树就相当于创建一个根节点,再创建他的左右子树;
此时我们发现,他会一直创建左子树,如图: 经过调试发现,我们的程序无法分辨叶子结点;此时我们可以使用一个特殊的值来表示NULL ?????????此时用户需要给程序的序列是:
????????此时需要给函数多传一个参数,来告诉程序用户用哪个值代替NULL的位置;当a[*pi]==n时,返回NULL;
????????这样我们就成功创建了一个二叉树。 2.二叉树的销毁 ????????我们的二叉树是使用malloc函数创建再堆上的,如果不手动释放,就会造成内存泄漏。二叉树的销毁与创建有一点不同,由于我们的二叉树是使用二叉链表创建,结点与结点之间由指针连接,如果先free根结点,我们就找不到子结点了,所以我们释放内存时,应该先释放左右子树的空间,再释放根节点的空间。
?????????传二级指针的原因:我们创建二叉树时,创建了一个指针变量指向这个在堆上的二叉树,当释放完空间时,这个指针就变成野指针了。 测试程序:
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 12:27:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |