二叉搜索树的插入,删除,和中序遍历
构建一个值的类型为int的二叉搜索树,输入N和M,然后进行N次插入操作,每次插入之后进行一次遍历验证代码正确性。然后进行M次删除操作,每次删除之后进行一次遍历验证代码正确性。
#include "bits/stdc++.h" using namespace std; typedef long long LL; const int INF = 0x3f3f3f3f; struct BST {int value;BST* lson;BST* rson; }* root; void remove(int value); BST* init(int val) {BST* point = (BST*)malloc(sizeof(BST));point->value = val;point->lson = point->rson = NULL;return point; } void insert(int val) {BST* father = NULL;BST* now = root;while (now != NULL) {if (now->value == val) {return;}father = now;if (now->value < val) {now = now->rson;} else {now = now->lson;}}if (father == NULL) {root = init(val);} else if (father->value < val) {father->rson = init(val);} else {father->lson = init(val);} } /*这题的难点在于删除一个节点,思路是:当要删除的节点右子树不为空时,用右子树中的最小值代替要删除的节点的值,同时删除右子树中值最小的节点否则右子树为空,可以用左子树代替当前位置当要删除的节点是唯一节点时,将root置为空 */ int findAndRemoveMin(BST* point) {while (point->lson != NULL) {point = point->lson;}int ans = point->value;remove(ans);return ans; } void remove(int value) {BST* father = NULL;BST* now = root;while (now != NULL) {if (now->value == value) {if (now->rson != NULL) {now->value = findAndRemoveMin(now->rson);} else {if (father == NULL) {root = root->lson;} else if (now->value > father->value) {father->rson = now->lson;} else {father->lson = now->lson;}free(now);}return;}father = now;if (now->value < value) {now = now->rson;} else {now = now->lson;}} } //二叉搜索树中序遍历后会得到一个升序数列,这里用递归写起来很方便; void ergodic(BST* point) {if (point == NULL) {return;}ergodic(point->lson);printf("%d ", point->value);ergodic(point->rson); } int main() {int N, M, value;scanf("%d%d", &N, &M);while (N--) {scanf("%d", &value);insert(value);ergodic(root);puts("");}while (M--) {scanf("%d", &value);remove(value);ergodic(root);puts("");}return 0; }
二叉树的中序遍历还有一种非递归写法,以此代码代替上面的ergodic效果也是一样的
void ergodic(BST* point) {stack<BST*> sta;while (point != NULL || !sta.empty()) {while (point != NULL) {sta.push(point);point = point->lson;}point = sta.top();sta.pop();printf("%d ", point->value);point = point->rson;} }
转载于:https://www.cnblogs.com/Angel-Demon/p/10220498.html
二叉搜索树的插入,删除,和中序遍历相关推荐
- 173. 二叉搜索树迭代器/94. 二叉树的中序遍历/145. 二叉树的后序遍历/98. 验证二叉搜索树
2020-05-12 1.题目描述 二叉搜索树迭代器 2.题解 对于二叉搜索树而言,进行中序遍历就可以得到其有序序列,我们可以先对树进行遍历,将结果保存在 vector中,然后进行计算即可. 3.代码 ...
- 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。
1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚,无非就是左小右大 创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下 ...
- LeetCode 501. 二叉搜索树中的众数(中序遍历)
文章目录 1. 题目 2. 中序遍历 1. 题目 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素). 假定 BST 有如下定义: 结点左子树中所含结点的值小于等 ...
- 二叉搜索树的插入与删除图解
=================================================================== 一.二叉搜索树(BSTree)的概念 二叉搜索树又 ...
- 【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)
problem L3-010 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序 ...
- 二叉搜索树的插入与删除(C语言)
代码如下: BinTree Insert( BinTree BST, ElementType X ) {if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */BST = (Bi ...
- 二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)
目录 1.leetcode 701. 二叉搜索树中的插入操作 1.题目 2.递归法 3.迭代法 2.leetcode 450. 二叉搜索树中的插入操作 1.题目 2.思路+递归法 3.迭代法 4.删除 ...
- 二叉搜索树+快速排序 查到文本中出现频率最多的100个词 【留学生作业】
完整工程 https://download.csdn.net/download/renzemingcsdn/21378979 需求 在这个作业中,你将从一个大文本文件中找到100个最经常出现的单词.程 ...
- 二叉搜索树(BST)的删除算法原理解析
二叉搜索树的删除算法主要分两种情况: 1.要删除的节点只有一个孩子(左孩子或右孩子),这种情况比较简单,只需要将该孩子连接到当前节点的父节点即可. 下面重点讲讲第二种情况: 2.第二种情况便是要删除的 ...
最新文章
- 北大女生拿下阿里数学预赛第一名!决赛入围率不到1%,最小晋级选手只有14岁...
- JAVA中常见的Exception
- json字符串转java对象数组
- 分享丨对医学图像分割中的置信度进行量化
- 联想a850 android 5.0 lollipop,手机资讯导报:全新纯净款MotoX运行Android5.0Lollipop视频曝光...
- 推荐DS书籍阅读笔记
- TeeChart插入
- Jquery-微博发布案例
- 新浪公司总裁兼首席执行官 曹国伟
- call apply bind的作用和区别
- 7kyu Jaden Casing Strings
- LayoutInflater.inflate()方法的深入理解
- 数字经济下,银行线上场景化建设的服务颗粒度、用户忠诚度和生态融合度
- html5 自动触发事件,HTML5视频触发事件触发一次
- python怎么使用int四舍五入_python浮点数舍入(ROUND)方式总结
- 小程序 配置域名 业务域名_使域名成为您的业务
- oracle中skimmer的意思,skimmer是什么意思_skimmer怎么读_skimmer翻译_用法_发音_词组_同反义词_撇取者-新东方在线英语词典...
- matlab试判断稳定性,MATLABsimulink稳定性分析时域分析
- scheduler_tick函数详解
- 什么是多线程?实现多线程有哪俩种编程方式