二叉排序树的创建

二叉排序树就是节点经过排序构建起的二叉树,其有以下性质:

1. 若它的左子树不为空,则左子树上所有节点的值均小于它的根节点的值。

2. 若它的右子树不为空,则右子树上所有节点的值均大于它的根节点的值。

3. 它的左、右子树也分别为二叉排序树。

画个图方便理解:

        第一张图是一个简单的排序二叉树,5<10<15,所以顺序应该是 10 作为根节点,小于10的在左子树,大于10的在右子树。

        如果现在又要加入一个节点呢?比如说:6,它应该放在哪里?因为 6 比 10 小,所以 6 应该放在 10 的左子树,又因为 6 比 5 大所以放在 5 的右子树。如图:

        那么如果是 16 呢?16 先和 10 进行比较,16>10 进入10的右子树,16 再和 15 比较,16>15,进入 15 的右子树。如图:

现在如果给一个数组:int array[6] = { 6,3,12,5,20,1 },如何构建一个二叉排序树呢?

我们可以回想我们在构建树的时候代码思路:

void CreatTree(TreeNode** T, int data) {if (data == "#") {孩子置空停止递归*T=NULL;}else {*T = (TreeNode*)malloc(sizeof(TreeNode));(*T)->val = data;(*T)->lchild = NULL;(*T)->rchild = NULL;递归左子树,递归右子树Creat_BST(&((*T)->rchild), data);Creat_BST(&((*T)->lchild), data);}}
}

        我这里写的不完整,主要看 else部分,创建节点,然后递归创建左右孩子节点,那么二叉排序树的特殊条件就是小的放在左孩子,大的放在右孩子,只不过加了个判断条件,而不是左右孩子都创建。

所以我们可以这样创建排序二叉树:

void Creat_BST(TreeNode** T, int data) {if (*T == NULL) {*T = (TreeNode*)malloc(sizeof(TreeNode));(*T)->val = data;(*T)->lchild = NULL;(*T)->rchild = NULL;}else {if (data> (*T)->val){Creat_BST(&((*T)->rchild), data);}else {Creat_BST(&((*T)->lchild), data);}}
}

        我的函数是只创建一个二叉排序树的节点,首先传进的 *T 是空,说明树为空,所以创建节点。第二个数据进入时,因为根不为空进入 else,如果小于根节点数据,则进入左孩子遍历(因为左孩子在在创建根节点时置空,所以这时就会创建左孩子存放第二个数据。),如果大于根节点数据,则进入右孩子遍历。

下面是用循环创建二叉排序树的主函数代码:

int main() {TreeNode* T = NULL;int array[6] = { 6,3,12,5,20,1 };for (int i = 0; i < 6; i++) {Creat_BST(&T, array[i]);}return 0;
}

最后写一个寻找树中是否有目标值的函数,逻辑很相似:

TreeNode* BST_search(TreeNode* T, int val) {if (T) {if (T->val == val) {return T;}else{if (val < T->val) {return BST_search(T->lchild, val);}if (val > T->val) {return BST_search(T->rchild, val);}}}else {return NULL;}
}

        如果相等就返回地址,如果小于树节点的值,利用二叉排序树的性质,就一定在左子树,继而进入左子树递归,如果大于树节点的值,就一定在右子树,进入右子树进行递归。如果都没有,最后一定会找到末端节点的左右孩子,末端节点的左右孩子是空,所以进入最后一个 else 返回NULL。

这就是文章的全部内容了,希望对你有所帮助,如有错误欢迎评论。

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

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

相关文章

Springboot零星知识点1

1、请求路径的组成 2、多个环境配置文件 3、对 自定义的属性 增加文字描述&#xff0c;而且IDEA不会警告 4、读取属性值的两种方式 5、东东

【linux】docker下nextcloud安装人脸识别插件

一、插件源码地址&#xff1a; GitCode - 开发者的代码家园 二、插件官网地址&#xff1a; Releases - Face Recognition - Apps - App Store - Nextcloud 三、插件安装教程&#xff1a; 1、查看本地nextcloud版本号 http://ipAddress:8080/settings/admin/overview 2、找…

【博客714】golang使用mmap来优化gc

golang使用mmap来优化gc&#xff1a; 背景 需要处理的对象非常多时&#xff0c;比如&#xff1a;时序数据库victoriametrics源码中&#xff0c;利用了mmap申请内存并自己维护&#xff0c;从而避免过多gc影响性能&#xff0c;因为频繁申请和释放堆对象会降低性能 参考victoriam…

PaddleClas 指定gpu

在使用PaddleClas进行模型训练或预测时&#xff0c;如果您想要指定使用特定的GPU设备&#xff0c;可以通过CUDA_VISIBLE_DEVICES环境变量来设置。 在命令行中设置GPU的方法如下&#xff1a; # 指定第0号GPU export CUDA_VISIBLE_DEVICES0 # 之后运行PaddleClas的命令&#xf…

深入解析:如何高效地更新Python字典

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、修改字典中的值 三、向字典中添加键值对 四、更新字典的两种方法总结 五、…

Java进阶学习笔记16——接口的综合案例

接口的综合案例&#xff1a; 接口的应用案例&#xff1a;班级学生信息管理模块的开发 需求&#xff1a; 请设计一个班级学生的信息管理模块&#xff1a;学生的数据有&#xff1a;姓名、性别、成绩。 功能1&#xff1a; 要求打印出全班学生的信息&#xff1b;功能2&#xff…

天线增益越高不一定越好

在以下应用场景下&#xff0c;过高的天线增益会导致性能下降&#xff1a;   城市环境或建筑物周围&#xff1a;高增益天线容易受到其他信号的干扰&#xff0c;在城市环境下或者在某些建筑物周围使用时&#xff0c;可能会被其他无线网络和其他电磁设备的信号干扰&#xff0c;…

浏览器的一些功能

1.改主页面 点浏览器右上角的三个点也就是一个... 点了设置 你可以在这里改它的颜色 还有页面 一些有意思的网站: sandspiel像素风格游戏 趣味互动游戏&#xff1a;请画一个小人 (webhek.com)​​​​​​ 2018 - makemepulse解压游戏 Layered Water (vlucendo.com)水模…

【C++项目】实时聊天的在线匹配五子棋对战游戏

目录 项目介绍 开发环境 核心技术 项目前置知识点介绍 Websocketpp 1. WebSocket基本认识 2. WebSocket协议切换原理解析 3. WebSocket报文格式 4. Websocketpp介绍 5. 搭建一个简单WebSocket服务器 JsonCpp 1. Json格式的基本认识 2. JsonCpp介绍 3. 序列化与反序…

[js] 中文编码解码encodeURI,decodeURI

encodeURI (URIstring)// 编码decodeURI (URIstring)  // 解码参考&#xff1a; JS 中的编码和解码&#xff08;encode和decode&#xff09;

CSS3盒模型与布局

盒模型与布局 居中对齐 文本居中对齐 水平居中 使用 text-align: center; 属性在块级元素内使内联元素(如文本、图片等)水平居中。 .parent {text-align: center; }垂直居中 使用 line-height 设置为与容器高度相同的值,实现单行文本的垂直居中。 .parent {height: 100…

基于地理坐标的高阶几何编辑工具算法(3)——相离面吸附

文章目录 工具步骤应用场景算法输入算法输出算法示意图算法原理 工具步骤 点击面&#xff0c;点击“相离面吸附”工具&#xff0c;绘制一个面&#xff0c;双击结束后&#xff0c;与所有相交的面进行吸附 应用场景 为了让相离的两个几何面在空间上相邻&#xff0c;使用该工具…

ROS+UBUNTU开发常用指令

ROS部分 一、功能包编译 1.1、单独编译指定的功能包 catkin_make -DCATKIN_WHITELIST_PACKAGES"需要单独编译的包名"1.2、再次回到编译所有功能包 catkin_make -DCATKIN_WHITELIST_PACKAGES""ubuntu部分 一、清空 Bash 历史记录文件&#xff1a; ~/.b…

数据插值之朗格朗日插值(一)

目录 一、引言 二、代码实现 2.1 Lagrange插值求插值多项式&#xff1a; 代码解析&#xff1a; 1.vpa解释 2.ploy&#xff08;x&#xff09;解释: 3.conv&#xff08;&#xff09;解释 4.poly2sym()解释 2.2 Lagrange插值求新样本值和误差估计&#xff1a; 代码解析&…

【编译原理】LL(1)预测分析法

一、实验目的 LL(1)的含义&#xff1a;第一个L表明自顶向下分析是从左向右扫描输入串&#xff0c;第2个L表明分析过程中将使用最左推导&#xff0c;1表明只需向右看一个符号便可决定如何推导&#xff0c;即选择哪个产生式进行推导。 LL(1) 预测分析方法是确定的自顶向下的语…

2024年【N1叉车司机】免费试题及N1叉车司机模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 N1叉车司机免费试题考前必练&#xff01;安全生产模拟考试一点通每个月更新N1叉车司机模拟试题题目及答案&#xff01;多做几遍&#xff0c;其实通过N1叉车司机模拟考试题库很简单。 1、【多选题】《中华人民共和国特…

Java 反射效率

反射性能比正常new对象使用慢&#xff0c;今天我们来测试一下其中效率&#xff0c;以及探索优化。 测试方法main long start System.currentTimeMillis();for (int i0;i<10000000;i){// 调用如下不同case的测试方法分别创建一千万个对象&#xff0c;对比效率}long end Sys…

第三讲 栈、队列和数组 (1)

文章目录 第三讲 栈、队列和数组3.1 栈3.1.1 出栈元素的不同排列与卡特兰数3.1.2 栈的顺序表实现3.1.3共享栈3.1.4 栈的链表实现3.1.5 栈的两种实现的优缺点3.1.6 c中的栈( s t a c k stack stack)容器适配器3.1.7 栈的应用:star:3.1.7.1 **栈在括号匹配中的应用**3.1.7.2 **栈…

白话文docker-001

第一章&#xff1a;Docker简介 Docker的定义与历史 Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。Docker 首次发布于2013年&#xff0c;由 Solomon Hykes 和他领导的团队在 dotCloud 公司开发。Docker 的…

CSS布局和定位应用方案

目录 浮动布局绝对布局表格布局响应式布局弹性布局网格布局多栏布局浮动布局 CSS3浮动布局的核心在于使用float属性将元素移出文档流,通过左右浮动来排列元素,并结合clear属性或清除浮动技巧(如这里的伪元素法)来处理浮动带来的副作用。尽管浮动布局在某些简单布局中依然实…