构建一个值的类型为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

二叉搜索树的插入,删除,和中序遍历相关推荐

  1. 173. 二叉搜索树迭代器/94. 二叉树的中序遍历/145. 二叉树的后序遍历/98. 验证二叉搜索树

    2020-05-12 1.题目描述 二叉搜索树迭代器 2.题解 对于二叉搜索树而言,进行中序遍历就可以得到其有序序列,我们可以先对树进行遍历,将结果保存在 vector中,然后进行计算即可. 3.代码 ...

  2. 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

    1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚,无非就是左小右大 创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下 ...

  3. LeetCode 501. 二叉搜索树中的众数(中序遍历)

    文章目录 1. 题目 2. 中序遍历 1. 题目 给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素). 假定 BST 有如下定义: 结点左子树中所含结点的值小于等 ...

  4. 二叉搜索树的插入与删除图解

    =================================================================== 一.二叉搜索树(BSTree)的概念        二叉搜索树又 ...

  5. 【CCCC】L3-010 是否完全二叉搜索树 (30分),完全二叉树判断+层次遍历(奇怪的方法)

    problem L3-010 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序 ...

  6. 二叉搜索树的插入与删除(C语言)

    代码如下: BinTree Insert( BinTree BST, ElementType X ) {if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */BST = (Bi ...

  7. 二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)

    目录 1.leetcode 701. 二叉搜索树中的插入操作 1.题目 2.递归法 3.迭代法 2.leetcode 450. 二叉搜索树中的插入操作 1.题目 2.思路+递归法 3.迭代法 4.删除 ...

  8. 二叉搜索树+快速排序 查到文本中出现频率最多的100个词 【留学生作业】

    完整工程 https://download.csdn.net/download/renzemingcsdn/21378979 需求 在这个作业中,你将从一个大文本文件中找到100个最经常出现的单词.程 ...

  9. 二叉搜索树(BST)的删除算法原理解析

    二叉搜索树的删除算法主要分两种情况: 1.要删除的节点只有一个孩子(左孩子或右孩子),这种情况比较简单,只需要将该孩子连接到当前节点的父节点即可. 下面重点讲讲第二种情况: 2.第二种情况便是要删除的 ...

最新文章

  1. 北大女生拿下阿里数学预赛第一名!决赛入围率不到1%,最小晋级选手只有14岁...
  2. JAVA中常见的Exception
  3. json字符串转java对象数组
  4. 分享丨对医学图像分割中的置信度进行量化
  5. 联想a850 android 5.0 lollipop,手机资讯导报:全新纯净款MotoX运行Android5.0Lollipop视频曝光...
  6. 推荐DS书籍阅读笔记
  7. TeeChart插入
  8. Jquery-微博发布案例
  9. 新浪公司总裁兼首席执行官 曹国伟
  10. call apply bind的作用和区别
  11. 7kyu Jaden Casing Strings
  12. LayoutInflater.inflate()方法的深入理解
  13. 数字经济下,银行线上场景化建设的服务颗粒度、用户忠诚度和生态融合度
  14. html5 自动触发事件,HTML5视频触发事件触发一次
  15. python怎么使用int四舍五入_python浮点数舍入(ROUND)方式总结
  16. 小程序 配置域名 业务域名_使域名成为您的业务
  17. oracle中skimmer的意思,skimmer是什么意思_skimmer怎么读_skimmer翻译_用法_发音_词组_同反义词_撇取者-新东方在线英语词典...
  18. matlab试判断稳定性,MATLABsimulink稳定性分析时域分析
  19. scheduler_tick函数详解
  20. 什么是多线程?实现多线程有哪俩种编程方式

热门文章

  1. [国家集训队2012]tree(陈立杰)
  2. 文库网站的文件转换源码分享
  3. H265/HEVC视频分层码流分析语义元素解释
  4. Vanilla SGD
  5. SAP Commerce Cloud UI(Spartacus Storefront) 的用户会话管理
  6. AI人工智能毕业设计课题:动漫网站,AI人物转动漫图像系统
  7. EasyExcel快捷导出
  8. 中子-伽马探测器响应模拟计算软件
  9. win10字体安装_WIN10美化:一键更换系统字体!
  10. Zabbix接口测试文档