构建一个值的类型为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. FreeTextBox License机制的粗浅分析
  2. IT人士还是要善待自己
  3. java中的工厂模式
  4. 3.5.5 CSMA/CD 协议
  5. “远程银行”优秀厂商认证!网易云信入选《区域性银行数字化厂商全景报告》...
  6. Boost:bind绑定的回归测试
  7. org.apache.hadoop.hbase.NotServingRegionException: hbase:meta,,1 is not online问题(暂时没有解决)
  8. devexpress PivotGrid Grand Total
  9. jzoj6307-安排【归并排序】
  10. 对博客园文章审核规则的质疑
  11. 如何使用USB摄像头搭配Visionpro进行视觉识别
  12. VS2010 visual studio Microsoft 应用程序错误报告 Microsoft Application Error Reporting 下列组件安装失败 1603 1935解决方法
  13. docker mysql 修改cnf_Docker下Mysql .cnf文件修改小贴士
  14. 【学习笔记】Android Fragments
  15. Python报错解决:local variable ‘xxx‘ referenced before assignment
  16. 取得目录和取得操作系统盘符以及获取系统盘可用空间
  17. 苹果签名是什么?苹果签名的作用是什么?
  18. 数学笔记24——分部积分
  19. [海边的卡夫卡.pdf
  20. vue 引入 自定义字体文件

热门文章

  1. win 10 使用本地代理自动配置pac
  2. linux最新flash+player,Adobe Flash Player v10.0.21.1 Alpha For Linux
  3. ML基础 - 深度神经网络中解决过拟合的方法
  4. 213:Python学习之数据分析篇——Jupyter 引入yfinance做K线股票分析
  5. matlab自耦变压器,基于MATLAB的500kV自耦变压器建模及仿真.pdf
  6. mybatis大于号 小于号
  7. Yolov5 windows下的环境搭建及训练
  8. 什么是私有云?您应该知道的 6 个优势
  9. Windows 正在连接xxx...无法打开到主机的连接。在端口xxx:连接失败问题解决
  10. 芝加哥大学计算机专业排名,芝加哥大学计算机科学硕士排名第33(2020年TFE Times排名)...