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

目录

1.题目

代码模板

2.分析

分类讨论各种情况

大概的框架

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

递归调用展开图

3.测试结果

其他写法

4.结论

5.注意事项

不推荐的写法


1.题目

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

代码模板

cpp 复制代码
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.节点值不为,没找到,继续递归查找

大概的框架

cpp 复制代码
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;

	//继续递归
	//......
}

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

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

双路递归思想

cpp 复制代码
	//继续递归
	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写入以下代码

cpp 复制代码
#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;
}

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

其他写法

cpp 复制代码
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.注意事项

不推荐的写法

cpp 复制代码
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的值是第二次,时间复杂度较高,尤其当二叉树的节点过多,二叉树的结构复杂时,执行效率低下,最好保存返回值免得重复调用

相关推荐
爱奥尼欧5 分钟前
【Linux笔记】网络部分——数据链路层mac-arp
linux·网络·笔记
爱吃甜品的糯米团子7 分钟前
详解 JavaScript 内置对象与包装类型:方法、案例与实战
java·开发语言·javascript
QT 小鲜肉15 分钟前
【Git、GitHub、Gitee】按功能分类汇总Git常用命令详解(超详细)
c语言·网络·c++·git·qt·gitee·github
liu****26 分钟前
11.Linux进程信号(三)
linux·运维·服务器·数据结构·1024程序员节
清风wxy28 分钟前
Duilib_CEF桌面软件实战之Duilib编译与第一个界面程序
c++·笔记·ui·mfc
郝学胜-神的一滴29 分钟前
Linux下,获取子进程退出值和异常终止信号
linux·服务器·开发语言·c++·程序人生
AI科技星43 分钟前
张祥前统一场论动量公式P=m(C-V)误解解答
开发语言·数据结构·人工智能·经验分享·python·线性代数·算法
CodeByV1 小时前
【C++】继承
开发语言·c++
nenchoumi31191 小时前
ROS2 Humble 笔记(七)标准与自定义 Interface 接口
笔记·机器人·ros2
碧海潮生_CC1 小时前
【CUDA笔记】01-入门简介
笔记·cuda