求二叉树深度以及寻找二叉树中某一节点值
求二叉树的深度依然用的是二叉树递归的特性。二叉树的深度就是你根节点的这一层加上他左孩子或者右孩子中深度大的哪一个,同样这也能被划分为子问题。
size_t BTreeDepth(BTNode* root)
{
if (root == NULL)
return 0;
if (BTreeDepth(root->_left) > BTreeDepth(root->_right))
return 1 + BTreeDepth(root->_left);
else
return 1 + BTreeDepth(root->_right);
}
这里需要多进行的一步是深度大小的判断,让1加上你左孩子或者右孩子深度大的那个,就需要比较两个深度,当然这里也可以用更简单清晰的三步运算符来计算。
return (BTreeDepth(root->_left) > BTreeDepth(root->_right))? 1 + BTreeDepth(root->_left) :1 + BTreeDepth(root->_right);
(a > c) ? a : c 三步运算符是如果a>c 那么执行a语句,如果不大于那就执行c语句。
第二个函数是查找二叉树中的某个数据,同样是递归,但是你在写的时候会遇到一个问题。
BTNode* BTreeFind(BTNode* root, BTDataType x)
{
if (root== NULL)
return NULL;
if (root->_data == x)
return root;
else
{
BTreeFind(root->_left, x);
BTreeFind(root->_right, x);
}
}
你运用递归写出来的程序是这样的,能运行吗?你会发现有时候你的程序编译没有错误但是每次运行都会出错误不能正确输出你要的东西
还拿之前这个图来走一遍,假如你现在查找的是3,进来1不为空,但是也不等于你找的3就开始往else里边的语句走,先走他的左孩子的递归,进来之后是2,不等于3,又开始往他的左孩子走,走到3发现等于3啊,这时候要返回root了,返回成功,这时候在root是2的函数中,往左子树的递归已经结束了,开始走下一句,结果进入到了2的右孩子中,遇到4左右孩子是空那就开始返回空。
其实简单的形容起来就是,你虽然找到了你的3但是函数并不知道你找到了,他还是会一直找下去,因为有两种情况都会返回一种是找到了对应的值,一种是空,所以即使你找到了,最终返回的也不是你的返回值。那应该怎么写呢?你需要的是开始进入下一次递归之前判断一下,你的上一层递归返回给你的地址是不是就是你要找的那个地方的地址,如果是那就不用再继续走下去了,直接返回上一层递归给你返回的地址就可以了。
BTNode* BTreeFind(BTNode* root, BTDataType x)
{
BTNode *ret = NULL;
if (root == NULL)
return root;
if (root->_data == x)
return root;
else
{
ret = BTreeFind(root->_left, x);
if (ret != NULL)
{
if (ret->_data == x)
return ret;
}
ret = BTreeFind(root->_right, x);
}
return ret;
}
写了之后有一系列的bug,很多时候ret都是空你是不能访问他的data的,导致调试了很多次才改成了现在一个目前没有bug的程序,用ret来接受你上一层递归的返回值,来进行判断,如果当前返回值已经等于你要找的数值的话,那就继续返回这个返回值。但是一定要注意,在判断ret的数据是不是你要找的数据之前一定要判断一下你的ret当前是不是空,如果是的话不判断继续进行访问就会出现内存出错问题。个人认为这个函数还是需要动一些脑子来仔细思考一下各种情况的。
求二叉树深度以及寻找二叉树中某一节点值相关推荐
- Nat. Mach. Intell. | 基于深度强化学习寻找网络中的关键节点
今天给大家介绍哈佛大学Yang-Yu Liu课题组和加利福尼亚大学洛杉矶分校Yizhou Sun课题组发表在nature machine intelligence上的一篇文章"Finding ...
- 数据结构知识整理 - 建立二叉链表、复制二叉树、计算二叉树深度、统计二叉树结点数
主要内容 建立二叉链表 复制二叉树 计算二叉树深度 统计二叉树的结点个数 建立二叉链表 在先序遍历的递归算法中,将输出语句改为输入语句即可.(可回顾"递归算法") 需要注意的是,递 ...
- leetcode104---求二叉树深度
leetcode104-求二叉树深度 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 思路 对于二叉树深度问题,深度为左右子树深度最大值加1 depth = ...
- 编程之美2.10 寻找数组中的最大值和最小值
这个问题其实很容易解决,就是循环遍历一遍数组,然后找到数组中存在的最大值和最小值就可以了,书中主要讨论的问题是比较次数较小的方法,不过,书中已经证明了,无论用什么方法最少的比较次数也就是循环遍历一遍的 ...
- 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离...
数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...
- 判断完全二叉树及求二叉树深度完整代码
完全二叉树定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下.从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二 ...
- 【数据结构】求二叉树深度的算法
要求二叉树的深度,方法是先求出左子树的深度,再求出右子树的深度,二叉树的深度就是左子树的深度和右子树的深度中的最大值加1. 自然而然想到用后根遍历的思想实现 主要步骤如下: 若二叉树为空,则返回0值, ...
- 求二叉树深度算法(深度优先、广度优先)
求二叉树深度的算法 求二叉树深度 方法一:深度优先的遍历方式 方法二:广度优先的遍历方式 总结 求二叉树深度 注:本文中二叉树通过二叉链表构建. 节点类型定义如下: struct node{char ...
- 求一颗二叉树中两个节点的最低公共父节点
题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...
最新文章
- 计算机无法识别y66,如何解决“@echo”是无法识别的命令
- 理解Java中的弱引用(Weak Reference)
- the graphics window has detected an error and is not able to ini
- vscode如何连接新设备_台州要用“超级平台”连接300万台工业设备,成为全省新示范...
- flask 写数据mysql_flask 创建数据提交到mysql中的方式
- pycharm 操作的一些设置,记录下
- ios python3闪退_解决Python3 cx_Freeze打包闪退/无法执行以及No module named 'matplotlib.backends.backend_tkagg'...
- 网络工程师Day10 以太网接口和链路配置
- C语言 关键字 | typedef
- laravel-admin下使用header头下载
- 电子计算机音乐乐谱aliez,aLIEz(核爆神曲)吉他谱(图片谱,指弹)_泽野弘之(澤野弘之 / さわの ひろゆき / Hiroyuki Sawano)...
- Android 7.1 PackageInstaller(应用安装器)增加自动点击安装
- 单机:Oracle 19C 数据库一键安装
- STM32HAL库使用RX8025
- 全球及中国医疗体制改革行业运作前景与发展策略研究报告2022年
- Salesforce中reRender和rendered控件的使用
- 微软:Visual Studio 2017是迄今为止最高效的版本
- 2022年上半年软考科目有哪些?要注意
- 2021中国软件和信息技术服务竞争力百强
- 南大科院Java工程实训
热门文章
- 导出Excel之单元格插入图片
- 安装ohmyzsh报错:curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
- 请停用以开发者模式运行的扩展程序?搞定谷歌浏览器插件弹窗
- Oracle Spatial研究
- SecureCRT之激活教程
- linux运维之道 第二章 2.1.1目录文件基本操作
- 转[罗曦]体验孤独——塞罕坝一夜 心灵缺失的地方
- java 生成https证书_java生成Https证书,及证书导入的步骤和过程
- k8s生成https证书的secret
- 如何顺利通过阿里云ACP考试,怎么备考?