c++二叉排序树的非递归插入与递归插入,递归之间不同写法的差异和代码示例比对

二叉排序树(Binary Search Tree,简称BST),是一种特殊的二叉树,它具有以下性质:
每个节点都有一个键(Key)和两个子节点,分别称为左子节点和右子节点。
左子节点的键小于其父节点的键,右子节点的键大于其父节点的键。
对每个节点,其左子树和右子树也都是二叉排序树。

当涉及到二叉排序树的插入操作时,我们通常可以使用递归和非递归两种方式来实现。下面将为你详细介绍这两种插入方法的差异,并提供代码示例。

非递归插入
非递归插入是通过迭代的方式实现的,使用循环来遍历树并找到合适的位置进行插入。具体步骤如下:

1.如果树为空,则创建一个新结点作为根结点。
2.否则,从根结点开始,与待插入结点的值进行比较。

· 如果待插入值小于当前结点的值,则进入左子树。
· 如果待插入值大于当前结点的值,则进入右子树。
· 如果待插入值等于当前结点的值,则不进行插入操作(可以根据需要进行处理)。

3.重复步骤2,直到找到一个空位置。
4.在空位置创建一个新结点,将待插入值赋给该结点。
下面是一个示例代码:

struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}
};void insertNode(TreeNode*& root, int value) {TreeNode* newNode = new TreeNode(value);if (root == nullptr) {root = newNode;return;}TreeNode* curr = root;TreeNode* parent = nullptr;while (curr != nullptr) {parent = curr;if (value < curr->val) {curr = curr->left;} else if (value > curr->val) {curr = curr->right;} else {// 处理结点值相等的情况return;}}if (value < parent->val) {parent->left = newNode;} else {parent->right = newNode;}
}

递归插入
递归插入是通过函数的递归调用实现的,每次递归都会判断当前结点是否为空,从而决定是向左子树还是右子树递归。具体步骤如下:

1.如果树为空,则创建一个新结点作为根结点。
2.否则,与当前结点的值进行比较。

· 如果待插入值小于当前结点的值,则递归调用插入函数,传入当前结点的左子结点。
· 如果待插入值大于当前结点的值,则递归调用插入函数,传入当前结点的右子结点。
· 如果待插入值等于当前结点的值,则不进行插入操作(可以根据需要进行处理)。

3.在递归的最底层,创建一个新结点,将待插入值赋给该结点,并将该结点作为当前结点的子结点。

下面是一个示例代码:

struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int value) : val(value), left(nullptr), right(nullptr) {}
};void insertNode(TreeNode*& root, int value) {if (root == nullptr) {root = new TreeNode(value);return;}if (value < root->val) {insertNode(root->left, value);} else if (value > root->val) {insertNode(root->right, value);} else {// 处理结点值相等的情况return;}
}

递归与非递归的差异

1.实现方式:递归方式通过函数栈实现,而非递归方式通过循环实现。
2.代码简洁度:递归方式通常更简洁,代码更容易理解;非递归方式需要更多的控制逻辑,但更灵活。
3.性能:递归方式可能产生更多的函数调用开销,而非递归方式通过迭代实现,性能可能更好。

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

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

相关文章

腾讯云优惠券(代金券)领取方法及最新优惠活动汇总

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效、安全可靠的云计算服务。为了回馈广大用户&#xff0c;腾讯云会不定期地推出各种优惠活动&#xff0c;其中包括优惠券的发放。本文将分享腾讯云优惠券的领取方法并汇总最新优惠活动&#xff0…

DNS 域名解析 后续(二)-----主从复制、分离解析

&#xff08;软件名 bind , 服务名 named&#xff09; bind主包 yum install bind bind-utils -y 主软件 和 配置包管理软件&#xff08;工具包&#xff09; rpm -q bind #检查是否安装dns服务 yum install bind bind-utils -y #安装dns服务,安装bind软件包 &#xff0…

函数的秘密

1. 函数的概念 在数学中我们学习过函数&#xff0c;而在C语言中其有着与数学不同的概念&#xff1a; 在C语言中&#xff0c;函数是指一组执行特定任务的语句&#xff0c;这些语句可以重复使用&#xff0c;并且可以在程序的不同部分调用。通过使用函数&#xff0c;程序员可以将…

docker容器互通方式

目录 docker中容器互通的方式 1、方式一&#xff1a;--link 2、方式二&#xff1a;创建service&#xff1a; docker中容器互通的方式 1、方式一&#xff1a;--link docker run --name mysql-container -d mysql:latest docker run --link mysql-container:app-container -i…

《ARM Linux内核源码剖析》读书笔记——0号进程(init_task)的创建时机

最近在读《ARM Linux内核源码剖析》&#xff0c;一直没有看到0号进程&#xff08;init_task进程)在哪里创建的。直到看到下面这篇文章才发现书中漏掉了set_task_stack_end_magic(&init_task)这行代码。 下面这篇文章提到&#xff1a;start_kernel()上来就会运行 set_task_…

怎么取消开机密码?4个必备方法!

“每次我开机都要输入密码&#xff0c;感觉有点麻烦&#xff0c;有什么方可以快速取消开机密码的吗&#xff1f;快给我推荐推荐吧&#xff01;” 为电脑设置开机密码&#xff0c;可以更好地保护电脑中的重要数据。但是用户需要在每次开机时都输入密码。这对于部分用户来说可能是…

常见类型的yaml文件如何编写?--kind: Service

基本说明 在 Kubernetes 中&#xff0c;Service 是一种抽象的方式&#xff0c;用于定义一组 Pod 的访问方式和网络服务。Service 提供了一个稳定的网络端点&#xff08;Endpoint&#xff09;&#xff0c;使得其他服务或外部用户可以通过 Service 来访问被管理的 Pod。 负载均…

连续整数相加C++

很多整数可以由一段连续的正整数序列&#xff08;至少两个数&#xff09;相加而成&#xff0c;比如 25345671213。 输入一个整数 N&#xff0c;输出 N 的全部正整数序列&#xff0c;如果没有则输出 NONE。 输入格式 一个整数 N。 输出格式 每行输出一个满足条件的整数序列。序…

2024.1.13 Kafka六大机制和Structured Streaming

目录 一 . Kafka中生产者数据分发策略 二. Kafka消费者的负载均衡机制 三 . 数据不丢失机制 生产者端是如何保证数据不丢失的呢&#xff1f; Broker端如何保证数据不丢失 消费端如何保证数据不丢失 Kafka中消费者如何对数据仅且只消费一次 四 . 启动Kafka eagle命令 数…

Python数据结构——列表

目录 一、认识Python数据结构 二、列表概述 三、列表切片 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;常见形式 &#xff08;三&#xff09;特别说明 四、列表的基本操作 &#xff08;一&#xff09;创建列表 &#xff08;二&#xff09;列表元素增加…

全新加密叙事,以Solmash为代表的 LaunchPad 平台如何为用户赋能?

铭文市场的火爆带来“Fair Launch”这种全新的代币启动方式&#xff0c;Fair Launch 的特点在于其为所有人参与 Launch 带来了公平的机会&#xff0c;所有链上玩家们都需要通过先到先得的方式 Mint 资产&#xff0c;VC 在 Fair Launch 中几乎没有话语权&#xff0c;不同的投资者…

CSS伪类:为网页增添交互和样式

CSS伪类是一项强大的特性&#xff0c;它允许开发者根据不同的状态、位置和结构选择器来选择和样式化HTML元素。通过使用CSS伪类&#xff0c;我们可以为网页增添交互性、响应性和样式化效果。本文将深入探讨CSS伪类的概念、常见用法和一些实用示例。 CSS伪类是什么 CSS伪类是一…

qml 传递界面对象指针给c++,以及c++调用qml函数,并在c++中更新ChartView数据

由于QVariant在qml中构建解析大量数据时,效率较低,比如有60万个点时,C++用QVariant传到qml中时,界面就会很卡。所以逆向思维,把qml界面对象指针传给c++,在c++中渲染界面数据。 下面讲具体实现: 1.c++创建对象并暴露给qml,并定义槽函数给qml直接调用 global.h:class…

【AI的未来 - AI Agent系列】【MetaGPT】1. AI Agent如何重构世界

上篇文章我们跑起来了第一个MetaGPT程序。本文主要学习了一下理论&#xff0c;什么是智能体&#xff0c;以及智能体如何重构世界。 0. 什么是智能体 智能体 LLM观察思考行动记忆 多智能体 智能体环境SOP评审路由订阅经济 用人话说&#xff0c;我理解的Agent&#xff1a; 智…

C#MQTT编程01--MQTT介绍

1、前言 近年来物联网的发展如火如荼已经渗透到我们生活的方方面面。从智能家居到工业自动化从智慧城市到智慧农业物联网&#xff0c;正在以前所未有的速度改变着我们的生活。 大家现在可能已经习惯了通过手机控制家里的灯光、空调和电视&#xff0c;这就是物联网在智能家居领域…

完美解决报错Please verify that the package.json has a valid “main“ entry处理方法

出现下图中的错误 &#xff0c;说明缺少main入口 解决方法&#xff1a; 1.删除 node_modules 和 package-lock.json这两个文件 2.命令行输入npm i 会重新下载包 3.重新执行检查没有报错

QT常见组件

Qt 提供了非常丰富的图形用户界面&#xff08;GUI&#xff09;组件&#xff0c;这些组件可以按照功能和用途进行分类。由于Qt库的组件众多且不断更新&#xff0c;以下是一份大致分类及其包含的部分组件示例&#xff0c;并非所有Qt版本或模块都包括以下全部控件&#xff0c;但涵…

01循环算法

1.求小数点的某一位&#xff0c;且超出float和double的精度问题 【题目描述】 分数a/b化为小数后&#xff0c;小数点后第n位的数字是多少&#xff1f; 【输入】 三个正整数a&#xff0c;b&#xff0c;n&#xff0c;相邻两个数之间用单个空格隔开。0<a<b<100&#…

组织管理开源项目邀请入伙

背景 企业数字化平台基础 企业数字化或者信息化&#xff08;这两者有一些区别&#xff09;实施过程中&#xff0c;基本上一个系统、产品的实施、上线都可能会碰到组织人员集成问题&#xff0c;组织机构一般组织机构部门&#xff0c;岗位&#xff0c;人员&#xff0c;可能会有…

【微信小程序独立开发2】授权登录 上

前言&#xff1a;这一节设想完成的功能为进入小程序后请求授权信息&#xff0c;用户授权登录后&#xff0c;弹出宠物登记页面&#xff0c;并根据宠物类型播放背景音乐 小程序昵称头像在之前的版本获取规则为触发后弹出用户授权弹窗&#xff0c;授权后可直接获取用户头像和昵称&…