目录

二叉查找树

初始化

二叉查找树的查找

二叉查找树的插入

二叉查找树的删除

二叉查找树的中序遍历

findMax and findMin

二叉查找树完整代码

测试用例


完整代码已上传至gitee中:gitee代码仓库

二叉查找树

二叉查找树,又称二叉排序树,亦称二叉搜索树,是数据结构中的一类。在一般情况下,查找效率比链表结构要高。

二叉查找树的定义

一棵空树或具有如下性质的树:

①若左子树不为空,则左子树上所有结点的值小于根结点的值;

②若右子树不为空,则右子树上所有结点的值大于根结点的值;

③左右子树也分别为二叉查找树

初始化

二叉查找树的初始化方式与二叉树一致.

public class TestBinarySearchTree {private static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}}//初始化根结点,默认初始化为nullprivate TreeNode root;
}

二叉查找树的查找

①首先比较根结点,若根节点的关键字值等于查找的关键字值,则查找成功;

②若根节点的关键字值大于查找的关键字值,则查找左子树;

③若根节点的关键字值小于查找的关键字值,则查找右子树;

④若未查找到,则返回false,查找失败.

    /*** 二叉查找树的contains查找操作* @param val* @return*/public boolean contains(int val) {if(root == null) {return false;}TreeNode cur = root;while(cur != null) {if(cur.val == val) {return true;}else if(cur.val > val) {cur = cur.left;}else {cur = cur.right;}}return false;}

二叉查找树的插入

①若二叉树为空,则单独生成根结点;

②若二叉树不为空,则查找待插入的值应该放入的位置,之后进行插入即可,具体步骤如下:

        while(cur != null) {if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {return false;//不能插入相同的数字}}

之后比较parent.val与待插入值的大小来决定插入位置,具体代码如下:

    /*** 二叉查找树的插入* @param val* @return*/public boolean insert(int val) {if(root == null) {root = new TreeNode(val);return true;}TreeNode cur = root;TreeNode parent = null;while(cur != null) {if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {return false;//不能插入相同的数字}}if(parent.val < val) {parent.right = new TreeNode(val);}else {parent.left = new TreeNode(val);}return true;}

二叉查找树的删除

二叉查找树的删除操作,首先找到待删除的结点和其parent结点,之后进行删除操作:

1、当cur.left == null时:

①若cur是root,则令root = cur.right;

②若cur是parent.left,则parent.left = cur.right;

③若cur是parent.right,则parent.right = cur.right;

2、当cur.right == null时:

①若cur是root,则令root = cur.left;

②若cur是parent.left,则parent.left = cur.left;

③若cur是parent.right,则parent.right = cur.left;

3、如果不满足上列两个判断条件,则另外进行判断,具体代码如下:

    /*** 二叉查找树的删除* @param val* @return*/public boolean remove(int val) {if(root == null) {return false;}TreeNode cur = root;TreeNode parent = null;while(cur != null) {if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {removeNode(parent,cur);return true;}}return false;}public void removeNode(TreeNode parent, TreeNode cur) {if(cur.left == null) {if(cur == root) {root = cur.right;}else if(parent.right == cur) {parent.right = cur.right;}else {parent.left = cur.right;}}else if(cur.right == null) {if(cur == root) {cur = cur.left;}else if(parent.left == cur) {parent.left = cur.left;}else {parent.right = cur.left;}}else {TreeNode target = cur.right;TreeNode targetParent = cur;while(target != null) {targetParent = target;target = target.left;}cur.val = target.val;if(target == targetParent.left) {targetParent.left = target.right;}else {targetParent.right = target.right;}}}

二叉查找树的中序遍历

即将从小到大排序后的数据输出

    /*** 二叉查找树的中序遍历* @param root*/public void inorder(TreeNode root) {if(root == null) {return ;}inorder(root.left);System.out.print(root.val + " ");inorder(root.right);}

findMax and findMin

根据分析可知,二叉查找树最左边一个结点为其最小值,最右边的一个结点为其最大值,则根据该性质,可以写出如下代码:

    /*** 输出二叉查找树中的最大值* @param root*/public void findMax(TreeNode root) {if(root == null) {System.out.println("二叉查找树为空");return ;}while(root.right != null) {root = root.right;}System.out.println("最大值为:" + root.val);}/*** 输出二叉查找树中的最小值* @param root*/public void findMin(TreeNode root) {if(root == null) {System.out.println("二叉查找树为空");return ;}while(root.left != null) {root = root.left;}System.out.println("最小值为:" + root.val);}

二叉查找树完整代码

public class TestBinarySearchTree {private static class TreeNode {public int val;public TreeNode left;public TreeNode right;public TreeNode(int val) {this.val = val;}}private TreeNode root;/*** 二叉查找树的contains操作* @param val* @return*/public boolean contains(int val) {if(root == null) {return false;}TreeNode cur = root;while(cur != null) {if(cur.val == val) {return true;}else if(cur.val > val) {cur = cur.left;}else {cur = cur.right;}}return false;}/*** 二叉查找树的插入* @param val* @return*/public boolean insert(int val) {if(root == null) {root = new TreeNode(val);return true;}TreeNode cur = root;TreeNode parent = null;while(cur != null) {if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {return false;//不能插入相同的数字}}if(parent.val < val) {parent.right = new TreeNode(val);}else {parent.left = new TreeNode(val);}return true;}/*** 二叉查找树的删除* @param val* @return*/public boolean remove(int val) {if(root == null) {return false;}TreeNode cur = root;TreeNode parent = null;while(cur != null) {if(cur.val < val) {parent = cur;cur = cur.right;}else if(cur.val > val) {parent = cur;cur = cur.left;}else {removeNode(parent,cur);return true;}}return false;}public void removeNode(TreeNode parent, TreeNode cur) {if(cur.left == null) {if(cur == root) {root = cur.right;}else if(parent.right == cur) {parent.right = cur.right;}else {parent.left = cur.right;}}else if(cur.right == null) {if(cur == root) {cur = cur.left;}else if(parent.left == cur) {parent.left = cur.left;}else {parent.right = cur.left;}}else {TreeNode target = cur.right;TreeNode targetParent = cur;while(target != null) {targetParent = target;target = target.left;}cur.val = target.val;if(target == targetParent.left) {targetParent.left = target.right;}else {targetParent.right = target.right;}}}/*** 二叉查找树的中序遍历* @param root*/public void inorder(TreeNode root) {if(root == null) {return ;}inorder(root.left);System.out.print(root.val + " ");inorder(root.right);}/*** 输出二叉查找树中的最大值* @param root*/public void findMax(TreeNode root) {if(root == null) {System.out.println("二叉查找树为空");return ;}while(root.right != null) {root = root.right;}System.out.println("最大值为:" + root.val);}/*** 输出二叉查找树中的最小值* @param root*/public void findMin(TreeNode root) {if(root == null) {System.out.println("二叉查找树为空");return ;}while(root.left != null) {root = root.left;}System.out.println("最小值为:" + root.val);}
}

测试用例

测试代码以及测试结果如下所示

public class TestDemo {public static void main(String[] args) {TestBinarySearchTree tree = new TestBinarySearchTree();//创建二叉查找树tree.insert(5);tree.insert(8);tree.insert(1);tree.insert(10);tree.insert(16);tree.insert(3);tree.insert(4);System.out.println("二叉查找树的中序遍历");tree.inorder(tree.root);System.out.println("\n" + "===================");System.out.println("二叉查找树的查找,查找16");System.out.println(tree.contains(16));System.out.println("\n" + "===================");System.out.println("二叉查找树的插入,插入21");tree.insert(21);tree.inorder(tree.root);System.out.println("\n" + "===================");System.out.println("二叉查找树的删除,删除1");tree.remove(1);tree.inorder(tree.root);System.out.println("\n" + "===================");System.out.println("输出二叉查找树的最大值和最小值");tree.findMax(tree.root);tree.findMin(tree.root);}
}

测试结果 

二叉查找树的中序遍历
1 3 4 5 8 10 16
===================
二叉查找树的查找,查找16
true===================
二叉查找树的插入,插入21
1 3 4 5 8 10 16 21
===================
二叉查找树的删除,删除1
3 4 5 8 10 16 21
===================
输出二叉查找树的最大值和最小值
最大值为:21
最小值为:3

Java实现二叉查找树及其相关操作相关推荐

  1. java communiframe_[Java教程]javascript iframe相关操作

    [Java教程]javascript iframe相关操作 0 2014-08-21 21:02:45 1. 获得iframe的window对象 iframeElement.contentWindow ...

  2. Java String类的相关操作

    Java String类的相关操作 一.如何遍历字符串 //法一 String str="hello world"; for(int i=0;i<str.length();i ...

  3. Spread表格组件For JAVA功能介绍—表格相关操作

    之前有篇文章我们说到 Spread 表格组件的 Java CTP 版本已经发布:<表格组件JAVACTP版本抢先预览>. 本篇我们来看一下他的主要功能,例如下图所示的Excel我们应当如何 ...

  4. java rect offset_Rect 的相关操作

    1.BOOL EqualRect( CONST RECT *lprc1, // first rectangle CONST RECT *lprc2 // second rectangle ); 说明: ...

  5. Java List集合转换相关操作

    1.List转换为String字符串,并且指定分隔符 ArrayList<String> keyList = new ArrayList<>();keyList.add(&qu ...

  6. java导入包大全_eclipse快速导入jar包的相关操作步骤

    eclipse怎样快速导入jar包呢?熟悉这款软件是非常简单的,今天小编就分享了关于eclipse快速导入jar包,有需要的朋友一起来看看吧! eclipse快速导入jar包的相关操作步骤 方法1·最 ...

  7. java ip地址相关操作

    java ip地址相关操作 @(JAVA)[scala] 参考CORE JAVA. 在JAVA中,InetAddress类用于操作与IP地址相关的内容,常用方法如下: java.net.InetAdd ...

  8. 正则表达式及其在Java和Python中的相关操作

    1.PCRE表达式全集1 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符(有^$()*+?.[\{|共计12个)或一个向后引用或一个八进制转义符 ^ 匹配输入字符串的开始位置 $ 匹配 ...

  9. Java时间日期类处理(LocalDateTime、LocalDate相关操作、获取周几、工作日休息日节假日判定)

    1.LocalDateTime相关操作:(时间推移.计算两个LocalDateTime之间的时间间隔.转LocalDate),代码如下: // 获取LocalDateTime对象String date ...

最新文章

  1. linux进程间通信:POSIX信号量
  2. 软件体系架构模式之二分层体系结构
  3. 路由器mstp多域配置举例
  4. 使用vb6绿色版做一个简易图片浏览器
  5. 博野哪里学计算机呢,@博野大学生 2021年征兵开始了!
  6. [:zh]<机械课程设计>第三张表自动计算部分 Android安装包[:]2017-12-20
  7. 【LeetCode笔记】剑指 Offer 15-. 二进制中1的个数 (Java、位运算)
  8. struts2的java.lang.NoSuchMethodException异常处理
  9. KICAD | 分享一个必须安装的插件Interactive HTML BOM plugin for KiCad
  10. Obstacle-- last interrupt reason
  11. 三种菜单控件的兼容性问题处理集锦
  12. 如何解决多机房、多网络下的物联网部署方案?
  13. layer 退 回 点击变灰色
  14. Outlier Detection with Isolation Forest(孤立森林异常检测)
  15. java pdf增加签名文件 pdf增加图片 ireport模板文件pdf增加图片
  16. 如何在国外做好自然科学研究-2
  17. 在多个QQ号码间共享自定义表情(转)
  18. v36.05 鸿蒙内核源码分析(工作模式) | 程序界的韦小宝是谁 | 百篇博客分析HarmonyOS源码
  19. 跨境电商收款之派安盈Payoneer个人账号收款教程
  20. 魔改一个自以为不太好的简历

热门文章

  1. 纯lua脚本搜索算法优化
  2. 二硫化钼量子点掺杂的ZnO纳米粒子(MoS2@ZnO)|负载氟西汀MoS2二硫化钼纳米片|超顺磁性碳化钽(Ta4C3-IONP-SPs)纳米复合材料
  3. 知识点 - 二次剩余
  4. 【仿真-simulation】仿真概念的介绍
  5. bson java_Java BSON使用
  6. 无法打开物理文件 XXX.mdf“。操作系统错误 5:“5(拒绝访问。)“的解决办法
  7. 转:Cookie详解
  8. 回收站图标如何变成透明的
  9. android手机防盗图片,android手机防盗措施介绍【图文】
  10. 系统分析师备考经验分享(附上备考方法)