重新整理数据结构与算法(c#)—— 二叉树排序树补删除节点[二十二]
前言
续前一章。
正文
删除节点规则:
1.假如删除的是叶子节点,让他的父节点,断开和它的联系。
2.如果删除节点右左子树或者右子树的话,那么应该这样。
如果删除节点是它的父节点的左节点,而删除节点有左节点,那么删除节点的父节点的左节点就等于删除节点的左节点。
举个栗子哈:

假如要删除的是15,那么20的左节点指向10。
为什么可以这样呢?其实我们的目的是什么呢?就是删除后还能保持原有的规则,20>15,就一定大于10,那么这个时候就是符合的。
如果删除节点是它的父节点的左节点,而删除节点有右节点,那么删除节点的父节点的左节点就等于删除节点的右节点。
为什么可以这样呢?
看图:

假设删除40,而40的左节点一定小于50,如果不小于是不会到左边的,这里是50>30,所以成立。
后面如果删除节点是父节点的右子树,怎么样,按照这样类推。
3.如果删除节点有左子树还有右子树。
规则是这样子的,有两种办法:
1.将删除节点的左子树最小的删除,然后删除节点的值等于左子树删除最小的那个值。
2.将删除节点右子树最大的值,然后删除节点的值等于右子树删除最大的那个值。
为什么是这样呢?可以按照上面画图就明白,以前的图丢了。
代码和测试
这里贴树模型,节点模型上一节的一样。
代码:
public class BinarySortTree
{
//根节点
Node root;
public BinarySortTree(Node root)
{
this.root = root;
}
public BinarySortTree() : this(null)
{
}
public void add(Node node)
{
if (root == null)
{
root = node;
}
else
{
this.root.addNode(node);
}
}
public void infixOrder()
{
if (root == null)
{
Console.WriteLine("root 为空");
}
else
{
root.infixOrder();
}
}
public Node searchNode(int value)
{
if (root==null)
{
Console.WriteLine("root 为空");
}
return root.searchNode(value);
}
public int delRightTreeMin(Node node)
{
Node tagert = node;
while (tagert.left!=null)
{
tagert = tagert.left;
}
delNode(tagert.Value);
return tagert.Value;
}
public Node searchParentNode(int value)
{
if (root != null)
{
return root.searchParentNode(value);
}
return null;
}
public void delNode(int value)
{
if (root == null)
{
return;
}
Node node=searchNode(value);
if (node == null)
{
return;
}
if (node.Value == root.Value)
{
root = null;
return;
}
Node parent = searchParentNode(value);
if (node.left == null && node.right == null)
{
if (parent.left.Value == value)
{
parent.left = null;
}
else
{
parent.right = null;
}
}
else if (node.left != null && node.right != null)
{
//删除左边最大值或者右边最小值,然后修改值为删除的值
parent.right.Value=delRightTreeMin(node.right);
}
else
{
if (node.left != null)
{
if (parent.left.Value == value)
{
parent.left = node.left;
}
else
{
parent.right = node.left;
}
}
else {
if (parent.left.Value == value)
{
parent.left = node.right;
}
else
{
parent.right = node.right;
}
}
}
}
}
测试:
static void Main(string[] args)
{
int[] arr = { 7, 3, 10, 12, 5, 1, 9, 2 };
BinarySortTree binarySortTree = new BinarySortTree();
//循环的添加结点到二叉排序树
for (int i = 0; i < arr.Length; i++)
{
binarySortTree.add(new Node(arr[i]));
}
//中序遍历后的数据
binarySortTree.infixOrder();
binarySortTree.delNode(12);
binarySortTree.delNode(5);
binarySortTree.delNode(10);
binarySortTree.delNode(2);
binarySortTree.delNode(3);
binarySortTree.delNode(9);
binarySortTree.delNode(1);
binarySortTree.delNode(7);
Console.WriteLine("删除后的元素");
binarySortTree.infixOrder();
Console.Read();
}
测试结果:

重新整理数据结构与算法(c#)—— 二叉树排序树补删除节点[二十二]的更多相关文章
- Java数据结构和算法(五)--希尔排序和快速排序
在前面复习了三个简单排序Java数据结构和算法(三)--三大排序--冒泡.选择.插入排序,属于算法的基础,但是效率是偏低的,所以现在 学习高级排序 插入排序存在的问题: 插入排序在逻辑把数据分为两部分 ...
- 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)
前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...
- Java数据结构和算法(一)树
Java数据结构和算法(一)树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 前面讲到的链表.栈和队列都是一对一的线性结构, ...
- 剑指Offer(二十二):从上往下打印二叉树
剑指Offer(二十二):从上往下打印二叉树 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/b ...
- 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL
树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构. a.树是n ...
- Java数据结构和算法(六)--二叉树
什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...
- ZH奶酪:【数据结构与算法】基础排序算法总结与Python实现
1.冒泡排序(BubbleSort) 介绍:重复的遍历数列,一次比较两个元素,如果他们顺序错误就进行交换. 2016年1月22日总结: 冒泡排序就是比较相邻的两个元素,保证每次遍历最后的元素最大. 排 ...
- 数据结构与算法之--高级排序:shell排序和快速排序
高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序大约是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希 ...
- Java数据结构和算法(三)--三大排序--冒泡、选择、插入排序
三大排序在我们刚开始学习编程的时候就接触过,也是刚开始工作笔试会遇到的,后续也会学习希尔.快速排序,这里顺便复习一下 冒泡排序: 步骤: 1.从首位开始,比较首位和右边的索引 2.如果当前位置比右边的 ...
- 数据结构与算法之PHP排序算法(堆排序)
一.堆的定义 堆通常是一个可以被看做一棵树的数组对象,其任一非叶节点满足以下性质: 1)堆中某个节点的值总是不大于或不小于其父节点的值: 每个节点的值都大于或等于其左右子节点的值,称为大顶堆.即:ar ...
随机推荐
- Centos安装常见软件
一.vscode sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e &qu ...
- linux下命令行打开文件夹窗口
方法一: 使用自带的命令:nautilus . 打开当前文件夹 nautilus . 打开指定路径文件夹 nautilus ddd/ccc/ 方法二:xdg-open xdg-open 命令相当于在 ...
- dbvisualizer不能执行pl/sql块
如果是如下语句: begin dbms_output.put_line('Hello World!'); end; 控制台会报错 解决方案:语句改写为如下 --/ begin ...
- python学习笔记(4):面向对象
面向对象 定义 class Student(被继承类): def __init__(self, xx, xxx): #构造函数 类方法的第一个参数一定是self.除此之外和普通函数并没有区别.同样可以 ...
- 干货分享 | 3个Zbrush实用减面工具分享
一.使用Sculptris Pro Sculptris Pro是zbrush中的一个功能按钮,点击此工具按钮,同时将笔刷转换至standard笔刷,即可减去需要平滑的面. 点击开启Sculptris ...
- 瑞云科技荣获全国电子信息行业专精特新“最具创新价值 TOP20”!
"专精特新",从概念提出到写入政府工作报告走过了十年.这十年来我国促进中小企业发展力度之大.出台政策之密集.含金量之高前所未有,足见走专精特新发展之路深入人心."专精特新 ...
- 记录--页面使用 scale 缩放实践
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近接到一个任务,需要把页面放大1.5倍显示.这里使用 css 里的 transform: scale(1.5) 来实现. documen ...
- 记录--用css画扇形菜单
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.效果图 用手机录屏再用小程序转换的gif,可能精度上有点欠缺. 2.实现过程 1.观察及思考 开始编码前我们首先观察展开后的结构:两个 ...
- SpringBoot3集成PostgreSQL
标签:PostgreSQL.Druid.Mybatis.Plus: 一.简介 PostgreSQL是一个功能强大的开源数据库系统,具有可靠性.稳定性.数据一致性等特点,且可以运行在所有主流操作系统上, ...
- Java内存马2-Spring内存马
Spring内存马 目录 Spring内存马 1.Spring&Spring MVC简介 2.环境搭建 3.Controller内存马 4.踩坑日记 5.Interceptor内存马 1.Sp ...