C : DS二叉排序树之删除(详细思路解答)

Description

给出一个数据序列,建立二叉排序树,并实现删除功能

对二叉排序树进行中序遍历,可以得到有序的数据序列

Input

第一行输入t,表示有t个数据序列

第二行输入n,表示首个序列包含n个数据

第三行输入n个数据,都是自然数且互不相同,数据之间用空格隔开

第四行输入m,表示要删除m个数据

从第五行起,输入m行,每行一个要删除的数据,都是自然数

以此类推输入下一个示例

Output

第一行输出有序的数据序列,对二叉排序树进行中序遍历可以得到

从第二行起,输出删除第m个数据后的有序序列,输出m行

以此类推输出下一个示例的结果

Sample

Hint

当删除数据不在序列中,那么删除操作等于不执行,所以输出序列不变化

分析:删除的节点有三种情况。

  1. 叶子节点,即没有左子树和右子树

  2. 只有右子树或者只有左子树

  3. 同时有左右子树

思路:

        创建deleteNode方法,deleteNode(BinaryTreeNode*& t, int deleteNumber),传入参数为根节点以及删除的值。

 值相等之后进行判断

第一个判断:

左子树为空(包含叶子节点的情况,左右子树同时为空,右子树为NULL,temp会保存NULL,最后t被替换成NULL,相当于删除了叶子节点)

第二个判断:

右子树为空,左子树不为空。操作同上

 第三个判断:

左右子树都不为空。先找到右子树上最小节点,于是用函数BinaryTreeNode* findMinNode(BinaryTreeNode* t)进行寻找,进入右子树之后,当前节点不存在左子树时即为最小值。t为当前要删除的节点,用右子树上最小节点值替换当前节点值。替换值完成后进入右子树,重新调用deleteNode删除掉右子树最小节点即完成替换。

 例如:

最关键的是要对二叉排序树的性质要熟悉,左子树上所有的值都小于根节点,右子树上所有的值都大于根节点。

AC代码:

#include <iostream>
using namespace std;struct BinaryTreeNode {int data;BinaryTreeNode* left;BinaryTreeNode* right;BinaryTreeNode() {data = 0;left = NULL;right = NULL;}
};class BinaryTree {
public:BinaryTreeNode* root;BinaryTree() {root = nullptr;}~BinaryTree() {destroyTree(root);}void init(BinaryTreeNode*& t, int data) {if (t) {if (data > t->data && t->right) {init(t->right, data);}else if (data < t->data && t->left) {init(t->left, data);}else if (data == t->data) {return;}if (data > t->data && t->right == NULL) {BinaryTreeNode* newNode = new BinaryTreeNode;newNode->data = data;t->right = newNode;}else if (data < t->data && t->left == NULL) {BinaryTreeNode* newNode = new BinaryTreeNode;newNode->data = data;t->left = newNode;}}else {t = new BinaryTreeNode;t->data = data;}}void midTree(BinaryTreeNode* t) {if (t) {midTree(t->left);cout << t->data << " ";midTree(t->right);}}void deleteNode(BinaryTreeNode*& t, int deleteNumber) {if (t == nullptr) {return;}//通过删除值与当前节点值进行比较,进行递归处理,直到值相等。if (deleteNumber > t->data) {deleteNode(t->right, deleteNumber);}else if (deleteNumber < t->data) {deleteNode(t->left, deleteNumber);}else {if (t->left == nullptr) {//左子树为空(包含叶子节点的情况,左右子树同时为空,右子树为NULL,temp会保存NULL,最后t被替换成NULL,相当于删除了叶子节点)BinaryTreeNode* temp = t->right;//临时节点保存右子树delete t;//删除当前节点t = temp;//用右子树替换当前节点}else if (t->right == nullptr) {//右子树为空,左子树不为空。操作同上BinaryTreeNode* temp = t->left;delete t;t = temp;}else {//左右子树都不为空。//找到右子树上最小节点BinaryTreeNode* minNode = findMinNode(t->right);//t为当前要删除的节点,用右子树上最小节点值替换当前节点值。t->data = minNode->data;deleteNode(t->right, minNode->data);//然后进入右子树,删除掉右子树最小节点即完成替换。}}}BinaryTreeNode* findMinNode(BinaryTreeNode* t) {while (t->left != nullptr) {t = t->left;}return t;}void destroyTree(BinaryTreeNode* t) {if (t) {destroyTree(t->left);destroyTree(t->right);delete t;}}
};int main() {int t;cin >> t;while (t--) {int n;cin >> n;BinaryTree p;while (n--) {int data;cin >> data;p.init(p.root, data);}p.midTree(p.root);cout << endl;int deleteTimes;cin >> deleteTimes;while (deleteTimes--) {int deleteNum;cin >> deleteNum;p.deleteNode(p.root, deleteNum);p.midTree(p.root);cout << endl;}}
}

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

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

相关文章

JS逆向实战——开发者工具检测

说明&#xff1a;仅供学习使用&#xff0c;请勿用于非法用途&#xff0c;若有侵权&#xff0c;请联系博主删除 作者&#xff1a;zhu6201976 一、背景 在JS逆向领域&#xff0c;Chrome开发者工具是核心&#xff0c;抓包、调试、看调用栈等都离不开它。可以说&#xff0c;逆向人…

Linux基础入门笔记

Linux基础入门笔记&#xff0c;具体可见下载链接 大家阅读时可善用目录功能&#xff0c;可以提高大家的阅读效率 下载地址&#xff1a;Linux笔记 初始linux 操作系统&#xff1a;操作系统是用户和计算机硬件之间的桥梁&#xff0c;调度和管理计算机硬件进行工作常见操作系统 W…

【算法Hot100系列】删除链表的倒数第 N 个结点

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

什么牌子猫粮比较好?质量口碑较好的主食冻干猫粮分享

由于猫咪是肉食动物&#xff0c;对蛋白质的需求很高&#xff0c;如果摄入的蛋白质不足&#xff0c;就会影响猫咪的成长。而冻干猫粮本身因为制作工艺的原因&#xff0c;能保留原有的营养成分和营养元素&#xff0c;所以冻干猫粮蛋白含量比较高&#xff0c;营养又高&#xff0c;…

自定义 spring-boot组件自动注入starter

1&#xff1a;创建maven项目 2&#xff1a;pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocati…

javaSE学习-4-类和对象

1. 面向对象的初步认知 1.1 什么是面向对象 面向对象编程&#xff08;OOP&#xff09;是一种程序设计范式&#xff0c;它将程序中的数据和操作数据的方法封装到对象中。在面向对象的世界里&#xff0c;一切都被视为对象&#xff0c;这些对象可以拥有数据&#xff08;成员变量&…

SQL面试题挑战01:打折日期交叉问题

目录 问题&#xff1a;SQL解答&#xff1a;第一种方式&#xff1a;第二种方式&#xff1a; 问题&#xff1a; 如下为某平台的商品促销数据&#xff0c;字段含义分别为品牌名称、打折开始日期、打折结束日期&#xff0c;现在要计算每个品牌的打折销售天数&#xff08;注意其中的…

【IDEA】Intellij IDEA相关配置

IDEA 全称 IntelliJ IDEA&#xff0c;是java编程语言的集成开发环境。IntelliJ在业界被公认为最好的Java开发工具&#xff0c;尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超…

lua安装

lua安装 1.Lua介绍 特点&#xff1a;轻量、小巧。C语言开发。开源。 设计的目的&#xff1a;嵌入到应用程序当中&#xff0c;提供灵活的扩展和定制化的功能。 luanginx&#xff0c;luaredis。 2.windows安装lua windows上安装lua&#xff1a; 检查机器上是否有lua C:\U…

双向链表、双向循环链表

目录 多级双向链表 力扣 430. 扁平化多级双向链表 双向循环链表 力扣 426. 将二叉搜索树转化为排序的双向链表 多级双向链表 力扣 430. 扁平化多级双向链表 你会得到一个双链表&#xff0c;其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子指…

有损编码——Wyner-Ziv理论

有损编码是一种在信息传输和存储中常见的编码技术&#xff0c;其主要目标是通过牺牲一定的信息质量&#xff0c;以换取更高的压缩效率。相比于无损编码&#xff0c;有损编码可以在保证一定程度的信息还原的前提下&#xff0c;使用更少的比特数来表示信息。Wyner-Ziv理论是一种重…

Eclipse_03_如何加快index速度

1. ini配置文件 -Xms&#xff1a;是最小堆内存大小&#xff0c;也是初始堆内存大小&#xff0c;因为堆内存大小可以根据使用情况进行扩容&#xff0c;所以初始值最小&#xff0c;随着扩容慢慢变大。 -Xmx&#xff1a;是最大堆内存大小&#xff0c;随着堆内存的使用率越来越高&a…