108.【C语言】数据结构之二叉树查找值为x的节点

目录

1.题目

代码模板

2.分析

分类讨论各种情况

大概的框架

关键部分(继续递归)的详解

递归调用展开图

3.测试结果

其他写法

4.结论

5.注意事项

不推荐的写法


1.题目

查找值为x的节点并返回节点的地址

代码模板

typedef int BTDataType;
typedef struct BinaryTreeNode
{BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right;
}BTNode;BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{}

2.分析

分类讨论各种情况

1.节点为NULL,返回NULL

2.节点值为x,找到了,返回其地址

3.节点值不为,没找到,继续递归查找

大概的框架

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;//继续递归//......
}

关键部分(继续递归)的详解

根节点查不到,分别去查左右子树,若查到则返回地址,查不到返回NULL

双路递归思想

	//继续递归BTNode* lret = BinaryTreeFind(root->left, x);if (lret)return lret;BTNode* rret = BinaryTreeFind(root->right, x);if (rret)return rret;return NULL;

递归调用展开图

以下面这张图为例子,比如查找5

(注:递归调用展开图较大,建议查看大图)

注:CSDN会压缩图片画质,无损bmp图片链接(大小 36.5M) 见https://pan.baidu.com/s/1VT9lg2xdofExMCjS8oIOzQ?pwd=xs7n)

3.测试结果

main.c写入以下代码

#include "Tree.h"
int main()
{BTNode* root = CreateTree();BTDataType x = 2;printf("x=5,address=%p\n", BinaryTreeFind(root, 5));printf("x=0,address=%p\n", BinaryTreeFind(root, 0));return 0;
}

打印的地址和监视窗口中查看到的地址一样

其他写法

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;BTNode* lret = BinaryTreeFind(root->left, x);if (lret)return lret;return  BinaryTreeFind(root->right, x);
}

4.结论

由分析可知,root->data若等于x则会层层返回至整个树的根节点

5.注意事项

不推荐的写法

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;if (BinaryTreeFind(root->left, x))return BinaryTreeFind(root->left, x);if (BinaryTreeFind(root->right, x))return BinaryTreeFind(root->right, x);return NULL;
}

BinaryTreeFind(root->left, x)和BinaryTreeFind(root->right, x)各被调用两次,找到x是第一次,返回x的值是第二次,时间复杂度较高,尤其当二叉树的节点过多,二叉树的结构复杂时,执行效率低下,最好保存返回值免得重复调用

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

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

相关文章

算法刷题Day1

BM47 寻找第k大 第一天就随便记录吧,万事开头难,我好不容易开的头,就别难为自己,去追求高质量了。嘿嘿嘿 题目 传送门 解题思路一:维护一个大小为k的最小堆。最后返回堆顶元素。 代码: # # 代码中的类名…

十五、linux之搭建JavaEE环境

1 概述 如果需要在 Linux 下进行 JavaEE 的开发,我们需要安装如下软件 2 安装 JDK 安装步骤 mkdir /opt/jdk mkdir /opt/jdk通过 xftp6 上传到 /opt/jdk 下 cd /opt/jdk 解压 tar -zxvf jdk-8u261-linux-x64.tar.gz tar -zxvf jdk-8u261-linux-x64.tar.…

基于PHP的音乐网站的设计与实现

摘 要 本系统采用PHP编程语言和MySQL数据库技术搭载了Apache服务器,完成了基于PHP的音乐网站设计,通过此次毕 业论文的撰写我明白了对于论文的选题要精确,要明确,要有明确的见解,要有足够的论证和创意,必须…

mysql 触发器进入历史

一、触发器 MySQL 触发器(Triggers)是一种数据库对象,它与表关联,能在特定的事件(如插入、更新或删除)发生时自动执行一些指定的操作。使用触发器可以帮助我们自动维护数据库的完整性、一致性,…

Re-squiggle算法

Re-squiggle算法 从纳米孔读取产生的电流信号水平数据被称为“squiggle”。基于这种squiggle信息进行碱基调用通常会与参考序列存在一些错误。Re-squiggle算法定义了一种新的从squiggle到参考序列的分配,因此称为re-squiggle。 Re-squiggle算法是Tombo框架的基础。该算法以包…

Springboot项目搭建(8)-用户登出与个人中心修改

1.提要信息 1.1 catch和then方法 then和catch是JavaScript中Promise对象的两个方法,用于处理异步操作的成功(成功回调)和失败(失败回调)情况。这两个方法通常与async/await语法一起使用,但也可以单独使用…

【2024】使用Docker搭建redis sentinel哨兵模式集群全流程(包含部署、测试、错误点指正以及直接部署)

目录💻 前言**Docker Compose介绍**最终实现效果 一、搭建集群1、创建文件结构2、创建redis节点3、验证节点4、创建sentinel哨兵5、验证Sentinel功能 二、spring连接1、添加依赖2、添加配置3、启动测试 三、直接部署流程1、拉取配置2、修改端口创建 前言 本篇文章主…

Python毕业设计选题:基于django+vue的智慧社区可视化平台的设计与实现+spider

开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 养老机构管理 业主管理 社区安防管理 社区设施管理 车位…

webpack 项目访问静态资源

使用 webpack dev serve 启动 react 项目后,发现无法使用 http://localhost:8080/1.png 访问到项目的 /static 目录下的 1.png 文件。我的 webpack-dev.js 配置如下: const webpack require(webpack) const webpackMerge require(webpack-merge) cons…

shell(2) 变量

定义变量 中间不需要加空格,末尾也不需要分号。 name1jth #不加引号定义 name2jth #单引号定义 name3"jth" #双引号定义 这三种都表示字符串变量。 使用变量 使用$符号,或者${}。加花括号主要是帮助解释器识别变量边界。 echo $name #输出jth…

React的Fiber小记 ⏰

写在最前:绝对是错漏百出的一篇博文,很多内容还没有写demo去验证,特别是浏览器的帧渲染那一块,权当小记。至于为什么想写Fiber,问就是Shopee面试的时候被问惨了,之前实习上班摸鱼的时候看过稀土掘金上一篇感…

JavaScript 前端开发:从入门到精通的奇幻之旅

目录 一、引言 二、JavaScript 基础 (一)变量与数据类型 (二)运算符 (三)控制结构 三、函数 (一)函数定义与调用 (二)函数作用域 (三&am…

安装Fcitx5输入框架和输入法自动部署脚本(来自Mark24)-Ubuntu通用

在Ubuntu22.04上安装rime中文输入法的基本教程 上述文章接近废弃。 使用新逻辑配置基本的Fcitx5的输入法。 安装 第一步,下载相关组件 sudo nala install vim sudo nala install ruby sudo nala install fcitx5-rime第二步,设置语言为Fcitx5 而非 默认…

【FAQ】使用Node.js 镜像 构建本地项目

在nodejs官方并没有提供使用node.js构建本地项目的方法,但是通过阅读官方文档,可以发现,官方在包管理器界面提供了如下语句 所以node.js容器是可以执行语句的 下面通过docker 的 -w 、-v 参数设置容器工作目录和目录映射(实现本…

C/C++语言基础--C++智能指针(unique_ptr、shared_ptr、week_ptr)

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 在C、C语言中,最经典的特性就是指针,他和内存相关,但是我们常常申请内存后忘记释放而导致内存泄漏,C提供了智能指针去解决这个内存泄漏问题;C语言…

Nature Methods | 人工智能在生物与医学研究中的应用

Nature Methods | 人工智能在生物与医学研究中的应用 生物研究中的深度学习 随着人工智能(AI)技术的迅速发展,尤其是深度学习和大规模预训练模型的出现,AI在生物学研究中的应用正在经历一场革命。从基因组学、单细胞组学到癌症生…

队列-链式描述(C++)

定义 使用链表描述队列时,通常包含以下几个基本要素: 队头指针(Front Pointer):指向队列中第一个(即最早进入队列的)元素的节点。队尾指针(Rear Pointer):指…

Flutter 之 InheritedWidget

InheritedWidget 是 Flutter 框架中的一个重要类,用于在 Widget 树中共享数据。它是 Flutter 中数据传递和状态管理的基础之一。通过 InheritedWidget,你可以让子 Widget 在不需要显式传递数据的情况下,访问祖先 Widget 中的数据。这种机制对…

Python 深度学习框架介绍

Python 是深度学习领域的主流编程语言,拥有许多强大的深度学习框架,广泛用于学术研究、工业应用和生产环境中。以下是一些最流行的 Python 深度学习框架,它们各自具有独特的功能和特点: 1. TensorFlow 开发公司:Google…

MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中

MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MyS…