什么是二叉查找树:
根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值,这一规则适用于二叉查找树中的每一个节点。
本文章重点来讨论一下关于二叉查找树删除节点的问题。
有一下二叉查找树,如图:

在删除节点的时候我们只需考虑一下三种情况:
(1)要删除的节点是叶子结点,如图:

(2)要删除的节点有左节点但是没有右节点,或者有右节点但是没有左节点,如图:

(3)要删除的节点既有左节点又有右节点,在这种情况下,我们只需要将找到待删节点的右子树中值最小的节点,将其删除并且获取其值,并用其值替换待删节点的值即可。如图:

如上图所示,如果要删除节点7,则需寻找其右子树中节点值最小的9,并且该值一定位于该右子树的最左子节点;但是还有一种情况,如图一右子树没有左节点,但是只有右节点,这种情况就回到了前面的第二种情况。
具体代码如下:注意Node类是一个内部类,在使用时注意方法。

package com.zc.algorithm;public class BinarySortTree {public class Node{int value;Node left;Node right;public Node(int  value){this.value = value;}public void add(Node node){if(node == null){return;}//判断传入的节点的值比当前子树的根节点的值大还是小if(node.value < this.value){//如果左节点为空if(this.left == null){this.left = node;}else{this.left.add(node);}}else{if(this.right == null){this.right =node;}else{this.right.add(node);}}}/*** 前序遍历二叉排序树* @param node*/public void middleOder(Node node){if(node == null){return;}middleOder(node.left);System.out.println(node.value);middleOder(node.right);}/*** 查找某一节点* @param value* @return*/public Node search(int value){if(this.value == value){return this;}else if(value < this.value){if(this.left == null){return null;}return this.left.search(value);}else{if(this.right == null){return null;}return  this.right.search(value);}}public Node searchParent(int value) {if((this.left != null && this.left.value == value) || (this.right != null && this.right.value == value)){return this;}else{if(this.value > value&& this.left != null){return this.left.searchParent(value);}else if(this.value < value && this.right !=null){return this.right.searchParent(value);}}return null;}}Node root;/*** 向二叉排序树中添加节点* @param node*/public void add(Node node){if(root == null){root = node;}else{root.add(node);}}public void frontShow(){if(root != null){this.root.middleOder(root);}}public Node SearchNode(int value){if(root == null)return null;else{return root.search(value);}}public void delete(int value) {if (root == null)return;else{Node target = SearchNode(value);//如果没有这个节点if(target == null){return;}//找到他的父节点Node parent = searchParent(value);//要删除的节点是叶子结点if(target.left == null && target.right == null){//要删除的节点是节点的左子节点if(parent.left.value == value){parent.left =null;}else{parent.right = null;}}//要删除的节点有两个子节点的情况else if(target.left != null && target.right != null){//删除右子树中值最小的节点,并获取到该节点的值int min = minDelete(target.right);//替换目标节点中的值target.value = min;}else{//需要删除的目标节点的左节点不为空if(target.left != null){//要删除的子节点是其父节点的左子节点,并且有左节点而没有有节点if(parent.left.value == value){parent.left = target.left;}//要删除的子节点是其父节点的右子节点,并且有左节点而没有有节点else{parent.right = target.left;}}//需要删除的目标节点的右节点不为空else{//要删除的节点是父节点的左节点,并且有右节点儿没有左节点if(parent.left.value == value){parent.left = target.right;}//要删除的节点是其父节点的右节点,并且有右孩子没有左孩子else{parent.right = target.right;}}}}}/*** 删除一颗树中最小的节点* @param node* @return*/public int minDelete(Node node){Node target = node;while(target.left != null){target = target.left;}delete(target.value);return target.value;}/*** 查找父节点* @param value* @return*/public Node searchParent(int value){if(root == null){return null;}else{return root.searchParent(value);}}public static void main(String[] args){int[] arr = new int[]{7,3,10,12,5,1,9};BinarySortTree binTree = new BinarySortTree();for(int i : arr){binTree.add(binTree.new Node(i));}binTree.delete(7);//查看树中的值binTree.frontShow();//查找//  Node node = binTree.new Node(3);//Node res = binTree.SearchNode(node.value);//System.out.println(res.value);// Node temp = binTree.SearchNode(20);//System.out.println(temp.value);}
}

二叉排序树(二叉查找树、二叉搜索树)相关推荐

  1. 详解二叉排序树(二叉搜索树、二叉查找树)以及Python实现相关操作

    二叉排序树 引言 1.定义 2.性质 3.操作 3.1 查找 3.2 插入 3.3 生成 3.4 删除 引言 如何更加高效的完成对数据的查询和添加操作,例如↓↓↓ 给你一个数列 (7, 3, 10, ...

  2. 二叉排序树(二叉搜索树,二叉查找树)

    递归实现二叉搜索树(BST)的创建 以数组的形式实现(循环) 以递归的形式实现

  3. 【数据结构】二叉查找树/二叉搜索树BST(附相关C++代码)

    文章目录 BST相关概念 BST如何添加节点 BST如何遍历 BST如何求最值 BST如何删除节点 BST如何查找节点 如何验证一棵树是BST 本文内容将主要介绍二叉查找树的相关概念,与关于二叉查找树 ...

  4. 二叉排序树或二叉搜索树

    一.二叉树基础 1.1 二叉排序树定义 二叉排序树(Binary Sort Tree)又称二叉查找(搜索)树(Binary Search Tree).它是一颗空树,或者具有下列性质: 若它的左子树不为 ...

  5. 二叉排序树(二叉搜索树)

    二叉排序树(也称为二叉查找树)是一种特殊的二叉树,它可以用来快速查找.插入和删除节点. 二叉排序树有以下性质: 在二叉排序树中,左子节点的值总是小于父节点的值. 在二叉排序树中,右子节点的值总是大于父 ...

  6. 【编程】二叉搜索树的定义

    二叉查找树(Binary Search Tree)(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右 ...

  7. 递归1:二叉搜索树的范围和

    给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7 ...

  8. 二叉搜索树相关知识及应用操作

    文章目录 概念 查找二叉搜索树的第k大节点 概念 二叉查找树(Binary Search Tree),(又名:二叉搜索树,二叉排序树)--它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不 ...

  9. 二叉搜索树 (BST)

    二叉搜索树 (BST : Binary Search Tree) 又名 二叉查找树 或 二叉排序树. 二叉搜索树: 左孩子的值 一定小于或等于 父结点的值 二叉搜索树: 右孩子的值 一定大于或等于 父 ...

  10. 二叉树、二叉搜索树,平衡二叉树(旋转)红黑树(红黑规则)

    文章目录 3.数据结构 3.1二叉树[理解] 3.2 二叉查找树[理解] 3.3平衡二叉树[理解] 3.4 红黑树[理解] 3.数据结构 3.1二叉树[理解] 二叉树的特点 二叉树中,任意一个节点的度 ...

最新文章

  1. 数据蒋堂 | 这个产品能支持多大数据量?
  2. 腾讯和头条,构建类脑神经元网络的两条路线之争
  3. Matlab进行录制、存储、绘制、读取音频
  4. CORS--跨域资源共享
  5. Epic Games资深程序工程师王祢: 使用UE4制作VR内容的优化
  6. OAuth2.0认证服务器之客户端相关配置
  7. 《Image Effects 》第一章学习笔记(2)
  8. 好几个div(元素)找到最后一个
  9. Django-manage.py
  10. 免费开源的高性能JavaScript电子表格:X-Sheet入门体验
  11. win7讲述人修复_win7系统TTS语音引擎修复补丁
  12. 计算机nie,聂眉宁-西南石油大学 - 计算机科学学院
  13. 在浏览器地址栏中,传数组参数
  14. 博士申请 | 阿尔伯塔大学招收人工智能方向全奖博士生、硕士生
  15. 解决Win7系统安装时缺少驱动
  16. 2017北邮计算机考研经验总结,北邮计算机专考研经验总结.docx
  17. bootstrap4.0图标使用_详解Bootstrap glyphicons字体图标
  18. 色彩校正(CCM)和伽马校正(Gamma)
  19. java 实现繁简字体转换(笨方法)
  20. 第三篇 IT 技术支持工程师职业发展路径与技能要求

热门文章

  1. TRIZ系列-创新原理-4-增加不对称性原理
  2. maven中央仓库官网
  3. Calico网络策略原理
  4. 判断一个字符串是否对称
  5. C#中的获取字符串或指定文件的MD5签名
  6. VulnHub-Lord Of The Root_1.0.1-靶机渗透学习
  7. 企业电脑屏幕监控:为何需要及如何选择适合的工具
  8. 为蜂鸟处理器添加DDR内存扩展
  9. 【愚公系列】2023年05月 网络安全高级班 031.应急响应溯源分析(红队渗透测试军火库)
  10. 每个人的成功都是一条辛酸的路