数据结构——链式二叉树(2)

目录

🍁一、二叉树的销毁

🍁二、在二叉树中查找某个数,并返回该结点

🍁三、LeetCode——检查两棵二叉树是否相等

🌕(一)、题目链接:100. 相同的树 - 力扣(LeetCode)

🌕(二)、解答:

🍁四、LeetCode——二叉树的前序遍历(与上一篇文章不太一样)

🌕(一)、题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

🌕(二)、解答:


接上篇文章,我们接着学习关于链式二叉树的几种操作。

🍁一、二叉树的销毁

//销毁
void FreeDestroy(BTNode* root)
{if (root == NULL){return;}FreeDestroy(root->left);FreeDestroy(root->right);free(root);
}

对于销毁,使用前序或者后序遍历都可以,但前序需要在销毁根结点的之前用临时指针保存根节点的左右子树,这样比较麻烦,所以最合适的还是后序,先销毁左右子树,然后才销毁根节点,这样按顺序的来就可以了。而我们使用递归最重要的是如何转换为子问题以及最小子递归的返回条件问题,这里很显然我们访问到NULL时就可以返回了,然后在依次销毁。

🍁二、在二叉树中查找某个数,并返回该结点

//在二叉树中找某个数的结点
BTNode* TreeFind(BTNode* root,int x)
{if (root == NULL)return NULL;if (root->val == x)return root;BTNode* tmp = TreeFind(root->left, x);if (tmp)return tmp;tmp = TreeFind(root->right, x);if (tmp)return tmp;return NULL;
}

①:依然是遍历的思路,这里我们选择前序遍历,先将根节点比较了再去左右子树比较;

②:然后最小子递归返回条件也是当root为空时,返回NULL,表示该条路径中没有找到数x;

③:若当前结点的数据等于x,表示找到了,就返回该结点;

④:若没找到,就先去左子树找,若左子树返回值不为NULL,说明找到了,返回左孩子结点;若左子树没找到,则返回NULL,不进如if语句;

⑤:左子树没找到,就开始找右子树,和左子树同样的道理,找到返回右子树结点,没找到返回NULL;

🍁三、LeetCode——检查两棵二叉树是否相等

🌕(一)、题目链接:100. 相同的树 - 力扣(LeetCode)

🌕(二)、解答:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {//两个树都为NULLif(p==NULL&&q==NULL)return true;//其中一个为NULLif(p==NULL||q==NULL)return false;//都不为NULL,则比较数据if(p->val!=q->val)//到这里说明该结点数据相同,则比较左子树,然后比较右子树return false;return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

①:若两棵树都为NULL,则代表此结点的数据相同,返回ture;

②:若其中一个为NULL,另一个不为NULL,则两结点数据不同,返回false;

③:若两个都不为NULL,则比较数据,若数据不相同,则两结点数据不同,返回false;

④:若不为上述三种情况,则说明该结点相同,则比较其左子树,然后比较其右子树;

🍁四、LeetCode——二叉树的前序遍历(与上一篇文章不太一样)

🌕(一)、题目链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

🌕(二)、解答:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*///手动写的计算树的结点个数函数int TreeSize(struct TreeNode*root){return root==NULL?0:TreeSize(root->left)+TreeSize(root->right)+1;}//手动写的遍历函数
void preorder(struct TreeNode* root,int* a,int* pi)
{if(root==NULL)return;a[(*pi)++]=root->val;preorder(root->left,a,pi);preorder(root->right,a,pi);
}//LeetCode给定函数
int* preorderTraversal(struct TreeNode* root, int* returnSize) {int n=TreeSize(root);int* a=(int*)malloc(sizeof(int)*n);int j=0;preorder(root,a,&j);*returnSize=n;return a;
}

二叉树的前序遍历,我们在上一篇文章已经讲解了,是一个很简单的过程;但这道题不一样,不一样在这里存在一些OJ题的技巧解释;

①:这道题的意思是叫我们把树的前序遍历的结果,存放在一个数组中,最后在返回该数组的起始地址;

②:我们看到LeetCode给定的函数接口中有两个形参,一个是待操作的树,另一个是整形指针,但我们看整形指针字面意思,应该知道我们应该返回一个数组的个数,那为什么会是一个整形指针呢?因为在接口外部传的是该变量地址,我们要在函数接口中根据待测树的结点数,去解引用整形指针改变函数外部的数组个数,所以使用了传址调用。

③:所以我们手动写了一个函数,计算出待测树的结点个数,然后解引用returnSize,将树的结点数赋值给它。

④:又因为我们要用到递归的思路,所以又手动写了一个函数,进行前序遍历及其将数据存到数组中的操作,又因为数组需要用到下标,为了下标j能在任意递归栈帧中改变,所以我们使用了传址调用,将下标j的地址传进去,这样,我们每赋值一次,就解引用后加1,这样下标就能动态改变;

⑤:接着便是前序遍历的算法,只是将打印换成了赋值给数组这一操作;

本次知识到此结束,希望对你有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【干货】【常用电子元器件介绍】【电阻】(二)--敏感电阻器

声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。   电子电路中除了采用普通电阻器外,还有一些敏感电阻器(如热敏电阻器、压敏电阻器、光敏电阻器等)也被广泛地应用。然而…

C# 使用 SapNwRfc 调用SAP RFC

好久没写过相关代码,今天又来贡献一篇 C# 使用 SapNwRfc 调用SAP RFC。用VS2022的WINFORM应用程序,使用NuGet中的SapNwRfc类库,call SAP系统中的RFC,传入7个参数,得到RFC返回的2张表的数据。 一、VS2022中新建WINFORM…

Nodejs前端学习Day1_补档

我给day1搞没了,还是觉得该补一个,有用 文章目录 前言一、学习目标二、学习目录三、为什么JavaScript代码可以在浏览器中运行四、为什么JavaScript可以操作DOM和BOM五、浏览器中的JavaScript运行环境总结 前言 补档 一、学习目标 二、学习目录 三、为什…

RustDesk私有化部署,自建远程桌面搭建教程

以linux操作系统为例: 解压安装 # 使用wget进行下载1.1.8-2版本(最新版本可以看上述发布地址) wget https://github.com/rustdesk/rustdesk-server/releases/download/1.1.8-2/rustdesk-server-linux-amd64.zip # 使用unzip解压 unzip rust…

Hive3.1.3基础

参考B站尚硅谷 目录 什么是HiveHive架构原理 Hive安装Hive安装地址Hive安装部署安装Hive启动并使用Hive MySQL安装安装MySQL配置MySQL 配置Hive元数据存储到MySQL配置元数据到MySQL Hive服务部署hiveserver2服务metastore服务编写Hive服务启动脚本(了解&#xff09…

EventSource 长链接执行

EventSource 说明文档MDN 其他参考文档 一、利用node启服务 import fs from fs import express from express const app express() // eventSource 仅支持 get 方法 // 服务器端发送的数据必须是纯文本格式,不能是二进制数据。 app.get(/api, (req, res) > …

table用position: sticky固定多层表头,滑动滚动条border边框透明解决方法

问题:我们发现,只要设置了border边框,这个位置滑动有内容经过就会出现如图的情况。 解决的方法:用outline(轮廓)替代border,以达到我们想要的样式。 table thead tr {border: none;outline-color: #fff;ou…

Redis(八)哨兵机制(sentinel)

文章目录 哨兵机制案例认识异常 哨兵运行流程及选举原理主观下线(Subjectively Down)ODown客观下线(Objectively Down)选举出领导者哨兵选出新master过程 哨兵使用建议 哨兵机制 吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新…

excel 设置密码保户

目录 前言设置打开密码设置编辑密码 前言 保户自己的数据不被泄漏是时常有必要的,例如财务数据中最典型员工工资表,如果不设置密码后果可想而知,下面我们一起来设置excel查看密码和编辑密码。我用的是wps,其它版本类似,可自行查资…

已经安装了CUDA,但是cmd执行nvcc -V报错:nvcc不是内部或外部命令,也不是可运行的程序或批处理文件

请注意,查看版本的指令是nvcc --version或nvcc -V,注意区分大小写 如果还是不能输出版本信息,那这个原因可能是由于没有在系统环境变量里添加CUDA。 先来看看CUDA是否安装成功: 在CUDA的安装路径下找到bandwidthTest.exe 和 devi…

一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读:一种通过增强的面部边界实现精确面部表示的多级人脸超分辨率二、使用步骤1、研究背景2、方法提出3、相关方法3.1、FSR网络结构3.2…

26.各品类中商品价格的中位数(ceil与floor函数)

题目: 题解: --这道题主要考察中位数的取法 SELECT category_id,cast(sum(price)/count(1) as DECIMAL(16,2)) medprice from( SELECTcategory_id,price,rn,max(rn)over(partition by category_id) max_rn from(SELECTcategory_id,price,row_number() …

Emergent Abilities of Large Language Models 机翻mark

摘要 证明通过扩大语言模型可以可靠地提高性能和样本效率在广泛的下游任务。相反,本文讨论了我们称之为大型语言模型的新兴能力的一种不可预测的现象。我们认为如果一个能力不存在于较小的模型中,但在较大的模型中存在,则该能力就是新兴的。…

开发微信小程序,将图片下载到相册的方法,saveImageToPhotosAlbum怎么用

在开发微信小程序的时候,经常能看到小程序里面有下载按钮,如何将小程序中的图片下载到手机相册中那,下面给大家说一下怎么做,代码如何去写。 一、到微信小程序后台开启“用户隐私保护指引” 1.进入小程序后台,侧拉拉到…

牛刀小试 - C++ 推箱子小游戏

参考文档 C笔记:推箱子小游戏 copy函数 memcpy()函数用法(可复制数组) 使用memcpy踩出来的坑,值得注意 完整代码 /********************************************************************* 程序名:推箱子小游戏 说明&#x…

前端怎么监听手机键盘是否弹起

摘要: 开发移动端中,经常会遇到一些交互需要通过判断手机键盘是否被唤起来做的,说到判断手机键盘弹起和收起,应该都知道,安卓和ios判断手机键盘是否弹起的写法是有所不同的,下面讨论总结一下两端的区别以及…

EMQX 单机及集群搭建

目录 1. 通过 Yum 源安装(CentOS7 单机安装) 1.1. 通过以下命令配置 EMQX Yum 源: 1.2. 运行以下命令安装 EMQX: 1.3. 运行以下命令启动 EMQX: 1.4. 访问 http://192.168.88.130:18083,默认用户名: adm…

C++ 重点内容:友元

目录 友元函数: 友元成员函数: 友元类: 友元是否有悖于OOP? 总结: 类因为具有封装和信息隐藏的特性(类外函数无法访问类的私有、保护成员),C提出友元解决特定的编程需要;友元分…

idea用version标签配置版本号报错版本号missing

问题描述&#xff1a; 用<mybatis-plus.version>3.3.2</mybatis-plus.version>配置pom的版本号&#xff0c;报错 dependencies.dependency.version for com.baomidou:mybatis-plus-boot-starter:jar is missing. line 33, column 21详细报错如下&#xff1a; 详…

安卓开发——Activity及常用布局和控件的使用

Activity及常用布局和控件的使用 一、实验目的 掌握Android常用布局和控件的使用。 Activity组件使用和Intent机制&#xff0c;加强对Activity生命周期的理解 二、实验设备及器件 Android Studio&#xff0c;图标&#xff1a;http://10.37.59.210/download/icon/MobileShopI…