1.二叉搜索树的定义:一颗树的所有左子树都比根小,所有右子树都比根大,成为二叉搜索树。

2.该BST树实现了9个重要方法,分别是关键字查找,插入,删除,删除节点后续节点查找,前序遍历,中序遍历,后序遍历,获取最大节点,获取最小节点。

3.以下是Java的代码实现:

//定义Node类,拥有元素值,节点名称,左孩子节点,右孩子节点,4个成员变量。

class Node {

int element;

String name;

Node leftChild;

Node rightChild;

public Node(int element, String name) {

this.element = element;

this.name = name;

}

}

public class BinSearchTreeDemo {

public Node root;

//查找节点

//方法思路:从根开始找起,如果比根小,就查找左孩子,如果比根大,就查找右孩子,如果相等,则返回该节点。

public Node find(int key){

if(root==null){

System.out.println("The tree is empty...");

return null;

}

Node current=root;

while (current.element!=key){

if(current.element>key){

current=current.leftChild;

}else{

current=current.rightChild;

}

if(current==null){

return null;

}

}

return current;

}

//插入节点

//方法思路:从根节点开始遍历,如果比根小,则继续查找左孩子,如果比根大,则继续查找右孩子,一直查到某节点左孩子或者右孩子为null,则在该节点后继插入节点。

//注意:被插入的元素在树中一定是叶子节点

public boolean insert(Node node){

if(root==null){

root=node;

return true;

}

Node current=root;

if(find(node.element)!=null){

System.out.println("不允许出现重复节点...");

return false;

}

while (current!=null){

if(current.element>node.element){

if(current.leftChild==null){

current.leftChild=node;

return true;

}

current=current.leftChild;

}else{

if(current.rightChild==null){

current.rightChild=node;

return true;

}

current=current.rightChild;

}

}

return false;

}

//前序遍历(根左右的)

public void preOrder_iterator(Node node){

System.out.println(node.element+" ");

if(node.leftChild!=null){

preOrder_iterator(node.leftChild);

}

if(node.rightChild!=null){

preOrder_iterator(node.rightChild);

}

}

//中序遍历(左根右)

public void inOrder_iterator(Node node){

if(node.leftChild!=null){

inOrder_iterator(node.leftChild);

}

System.out.println(node.element+" ");

if(node.rightChild!=null){

inOrder_iterator(node.rightChild);

}

}

//后序遍历(左右根)

public void postOrder_iterator(Node node){

if(node.leftChild!=null){

postOrder_iterator(node.leftChild);

}

if(node.rightChild!=null){

postOrder_iterator(node.rightChild);

}

System.out.println(node.element+" ");

}

//获取树中最小节点

public Node getMinNode(Node node){

if(find(node.element)==null){

System.out.println("This node does not exist...");

return null;

}

Node current=node.leftChild;

while (current!=null){

current=current.leftChild;

}

return current;

}

//获取树中最大节点

public Node getMaxNode(Node node){

if(find(node.element)==null){

System.out.println("This node does not exist...");

return null;

}

Node current=node.rightChild;

while (current!=null){

current=current.rightChild;

}

return current;

}

//删除节点

//方法思路:

//1.首先找到删除节点和该节点对应的父亲节点,分别用target变量和targetParent变量保存,并且利用一个布尔变量保存删除的节点是父亲的左孩子还是右孩子,左孩子则为true,右孩子则为

// false

//2.接下来进行节点删除,删除需要分为三种情况,第一种是删除的是叶子节点,该情况是如果删除的是父亲的左孩子,则直接将父亲的leftChild设为target的左孩子,,如果删除的是右孩子,则 // 直接将父亲的rightChild设为target的左孩子,即为null;第二种情况是删除的节点带有一个孩子节点,该节点可以是左孩子,也可以是右孩子,需要分开处理,如果删除的节点本身是左子树 // ,并且带有左孩子,则将targetParent的左孩子指向target的左孩子,如果带有右孩子,则将targetParent的左孩子指向target的右孩子;如果删除的节点本身是右子树,并且带有左孩子 // ,则将targetParent的右孩子指向target的左孩子,否则指向右孩子。第三种情况是删除的是带有两个孩子的节点,这种情况稍微复杂,我们单独说明

//3.带有两个孩子的节点删除情况分析:该方法伴有一个getFollwingNode的方法,目的是为了捕获删除节点的后续节点,思路如下,

// ①.先找到删除节点的右子树节点,调用getFollowingNode方法可以找到删除节点的右子树中的最左边的节点,也就是最小节点,并返回该最小节点,此时调整该右子树的结构,将返回节点的 // 父节点指向返回节点的右子树(如果存在的话,左子树一定是不存在的);

// ②.此时将删除节点的父节点指向该返回的节点(注意左右情况),然后将返回节点的左指针指向删除节点的左孩子,右指针指向删除节点的右孩子,结束。

public boolean delete(int key){

if(root==null){

System.out.println("The tree is empty...");

return false;

}

Node targetParent=root;

Node target=root;

boolean isLeftChild=false;

//找到对应的删除节点target和其父节点targetParent

while (target.element!=key){

if(key

targetParent=target;

target=target.leftChild;

isLeftChild=true;

}else{

targetParent=target;

target=target.rightChild;

isLeftChild=false;

}

if(target==null){

System.out.println("The target node does not exist...");

return false;

}

}

//如果删除的节点是叶子节点

if(target.leftChild==null&&target.rightChild==null){

if(root.element==target.element){

root=null;

return true;

}

if(isLeftChild){

targetParent.leftChild=target.leftChild;

}else{

targetParent.rightChild=target.leftChild;

}

}

//如果删除的节点只有一个子节点

//如果该节点是左子树

else if(target.leftChild!=null&&target.rightChild==null){

if(root.element==target.element){

root=target.leftChild;

return true;

}

if(isLeftChild){

targetParent.leftChild=target.leftChild;

}else{

targetParent.leftChild=target.rightChild;

}

}

//如果该节点是右子树

else if(target.leftChild==null&&target.rightChild!=null){

if(root.element==target.element){

root=target.rightChild;

return true;

}

if(isLeftChild){

targetParent.rightChild=target.leftChild;

}else{

targetParent.rightChild=target.rightChild;

}

}

else{

Node followingNode = this.getFollowingNode(target);

if(target.element == root.element)

root = followingNode;

else if(isLeftChild)

targetParent.leftChild = followingNode;

else

targetParent.rightChild = followingNode;

followingNode.leftChild = target.leftChild;

followingNode.rightChild = target.rightChild;

}

return true;

}

//获取删除节点后续节点

public Node getFollowingNode(Node node2Del){

Node nodeParent = node2Del;

//只有被删除节点有左右子节点时,才会调用该方法

//这里直接调用rightChild是没有问题的

Node node = node2Del.rightChild;

while(node.leftChild != null){

nodeParent = node;

node = node.leftChild;

}

if(node.element != node2Del.rightChild.element)

nodeParent.leftChild = node.rightChild;

else

nodeParent.rightChild = node.rightChild;

return node;

}

}

bst java_BST(二叉搜索树) Java 实现解析相关推荐

  1. 《LeetCode力扣练习》第96题 不同的二叉搜索树 Java

    <LeetCode力扣练习>第96题 不同的二叉搜索树 Java 一.资源 题目: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回 ...

  2. BST(二叉搜索树)

    BST(二叉搜索树) 所谓二叉搜索树(Binary Search Tree,简称 BST)大家应该都不陌生,它是一种特殊的二叉树. 特殊在哪里呢? 简单来说就是:左小右大 BST的完整定义如下: BS ...

  3. ( “树” 之 BST) 235. 二叉搜索树的最近公共祖先 ——【Leetcode每日一题】

    二叉查找树(BST):根节点大于等于左子树所有节点,小于等于右子树所有节点. 二叉查找树中序遍历有序. 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. ...

  4. 树、二叉树、二叉搜索树_检查二叉树是否为BST(二叉搜索树)

    树.二叉树.二叉搜索树 Description: 描述: This article describes how to check whether a given tree is BST or not? ...

  5. LeetCode 653. 两数之和 IV - 输入 BST(二叉搜索树迭代器双指针)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个二叉搜索树和一个目标结果,如果 BST 中存在两个元素且它们的和等于给定的目标结果,则返回 true. 案例 1: 输入: 5/ \3 6/ \ ...

  6. 2.13_binary_search_tree(BST)_二叉搜索树

    二叉树节点类 class BiTreeNode(object):"""二叉树节点类"""def __init__(self, data):s ...

  7. Leetcode--96. 不同的二叉搜索树(java)

    给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1         3   ...

  8. 【Java数据结构】BST树(二叉搜索树)总结03(求BST树高度,求BST树节点个数)

    二叉树总结:入口 二叉树的基本操作: 1.插入,删除 操作 2.前.中.后序遍历,层序遍历 3.求BST树高度,求BST树节点个数 4.返回中序遍历第k个节点的值 5.判断一个二叉树是否是BST树,判 ...

  9. 真c++ 从二叉树到红黑树(3)之二叉搜索树BST

      此文章为从二叉树到红黑树系列文章的第三节,主要介绍介绍二叉搜索树BST,为AVL和RedBlack打下基础 文章目录 一.前面文章链接~(点击右边波浪线可以返回目录) 二.二叉搜索树BST的定义~ ...

  10. 二叉搜索树(BST)

    目录 一,二叉搜索树(二叉查找树,二叉排序树,BST) 二,二叉搜索树的性质 三,查询 四,插入节点 五,删除节点 六,OJ实战 力扣 98. 验证二叉搜索树 面试题 04.05. 合法二叉搜索树 力 ...

最新文章

  1. Struts2 @ResultPath注释示例
  2. python读取视频占用内存太大_视频流用多进程读写,内存溢出怎么办?
  3. java redis 主从配置_Redis实现主从复制(MasterSlave)
  4. C++ Priority Queues(优先队列)
  5. R绘图 vs Python绘图(散点图、折线图、直方图、条形图、箱线图、饼图、热力图、蜘蛛图)
  6. php打补丁,PHPMailer库打补丁后漏洞仍然存在,怎么解?
  7. oracle无效的关联运算符,菜鸟请教:关联操作符=>用法
  8. android uber启动动画,仿 Uber 视频背景登录界面以及登录动画
  9. 王者荣耀故事站小程序源码/含vue后台
  10. Kafka性能测试实例
  11. MESSL(maven + extjs + spring portlet mvc + spring web flow + liferay )整合架构 7
  12. 【Windows】打印机0x0000011b解决办法
  13. 分段衰减衰减系数_吉林省松花江干流氨氮综合衰减系数分段研究
  14. element ui 级联选择器,渲染后不显示数据
  15. 帝国时代3 怎样旋转建筑物
  16. 用电脑开热点启用电脑无线配置
  17. 关于出现 linux Table is marked as crashed and should be repaired
  18. 【Unity】动作游戏开发实战详细分析-07-连续技与组合技功能设计
  19. 2020读书笔记 《丘吉尔传记》
  20. 手机4G网络(网速超级震撼)

热门文章

  1. 华为Dorado固态存储技术手册合集
  2. easyUI 添加排序到datagrid
  3. Windows Azure Tools DSInit Error
  4. IT规划的企业应用实践(8)研究的目的和意义 之 解决两大矛盾
  5. 关于控件Visible属性的说明
  6. Angular Filter实现页面搜索
  7. 剑指Kubernetes 揭秘腾讯云的PaaS技术选型策略
  8. Datatable删除行的Delete和Remove方法介绍
  9. Perl正则表达式--练习1
  10. ArcGIS for Android 中MapView截图实现方法