当前位置: 首页 > news >正文

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.lryc.cn/news/497665.html

相关文章:

  • Java学习笔记(10)--面向对象基础
  • 社群分享在商业引流与职业转型中的作用:开源 AI 智能名片 2+1 链动模式小程序的应用契机
  • nodejs官方文档学习-笔记-1
  • android视频播放器之DKVideoPlayer
  • Linux——基础命令(3)
  • MySQL备份恢复
  • 鲲鹏麒麟安装离线版MySQL5.7
  • 【不稳定的BUG】__scrt_is_managed_app()中断
  • MyBatis 详解
  • Cursor+Devbox AI开发快速入门
  • 编写按层次顺序(同一层自左至右)遍历二叉树的算法。或:按层次输出二叉树中所有结点;
  • docker 安装mysql8.0.29
  • vue深入理解输入框字符限制的优化设计
  • 完整指南:在Ubuntu 20.04 ROS 1环境中配置和使用Orbbec SDK
  • 【Leetcode Top 100】138. 随机链表的复制
  • 2024年12月HarmonyOS应用开发者基础认证全新题库
  • Flink问题总结
  • Day17 C++ vector 容器
  • 常见Linux命令(详解)
  • AgGrid 组件封装设计笔记:自定义 icon 以及每个 icon 的点击事件处理
  • vb.net常用命名空间
  • Netty面试内容整理-Netty 工作原理
  • CMD 介绍
  • 【项目日记】仿mudou的高并发服务器 --- 实现HTTP服务器
  • Android 使用TabLayout + ViewPager2 实现标签页的视图切换
  • vue 项目实现阻止浏览器记住密码
  • 7. 一分钟读懂“单例模式”
  • 28个炫酷的纯CSS特效动画示例(含源代码)
  • 百问FB网络编程 - 主要函数介绍
  • Unity类银河战士恶魔城学习总结(P155 More example on audio effects更多的音效细节)