Java基础之二叉搜索树的基本操作

作者:保护眼睛 时间:2023-07-08 10:07:07 

一、二叉搜索树插入元素


/**
* user:ypc;
* date:2021-05-18;
* time: 15:09;
*/
    class Node {
       int val;
       Node left;
       Node right;

Node(int val) {
           this.val = val;
       }
   }
   public void insert(int key) {
       Node node = new Node(key);
       if (this.root == null) {
           root = node;
       }
       Node cur = root;
       Node parent = null;
       while (cur != null) {
           if (cur.val == key) {
               //System.out.println("元素已经存在");
               return;
           } else if (cur.val > key) {
               parent = cur;
               cur = cur.left;
           } else {
               parent = cur;
               cur = cur.right;
           }
       }
       if (key > parent.val) {
           parent.right = node;
       } else {
           parent.left = node;
       }

}

二、搜索指定节点


public boolean search(int key) {
       Node cur = root;
       while (cur != null) {
           if (cur.val == key) {
               return true;
           } else if (cur.val > key) {
               cur = cur.left;
           } else {
               cur = cur.right;
           }
       }

return false;
   }

三、删除节点方式一


public void removenode1(Node parent, Node cur) {
       if (cur.left == null) {
           if (cur == root) {
               root = cur.right;
           } else if (cur == parent.right) {
               parent.left = cur.right;
           } else {
               parent.right = cur.right;
           }
       } else if (cur.right == null) {
           if (cur == root) {
               root.left = cur;
           } else if (cur == parent.right) {
               parent.right = cur.left;
           } else {
               parent.left = cur.left;
           }
       } else {
           Node tp = cur;
           Node t = cur.right;
           while (t.left != null) {
               tp = t;
               t = t.left;
           }
           if (tp.left == t) {
               cur.val = t.val;
               tp.left = t.right;
           }
           if (tp.right == t) {
               cur.val = t.val;
               tp.right = t.right;
           }
       }

}

public void remove(int key) {
       Node cur = root;
       Node parent = null;
       while (cur != null) {
           if (cur.val == key) {
               removenode1(parent, cur);
             //removenode2(parent, cur);
               return;
           } else if (key > cur.val) {
               parent = cur;
               cur = cur.right;
           } else {
               parent = cur;
               cur = cur.left;
           }
       }
   }

四、删除节点方式二


public void removenode2(Node parent, Node cur) {

if (cur.left == null) {
           if (cur == root) {
               root = cur.right;
           } else if (cur == parent.right) {
               parent.left = cur.right;
           } else {
               parent.right = cur.right;
           }
       } else if (cur.right == null) {
           if (cur == root) {
               root.left = cur;
           } else if (cur == parent.right) {
               parent.right = cur.left;
           } else {
               parent.left = cur.left;
           }
       } else {
           Node tp = cur;
           Node t = cur.left;
           while (t.right != null) {
               tp = t;
               t = t.right;
           }
           if (tp.right == t) {
               cur.val = t.val;
               tp.right = t.left;
           }
           if (tp.left == t) {
               cur.val = t.val;
               tp.left = t.left;
           }
       }

}

五、运行结果


/**
* user:ypc;
* date:2021-05-18;
* time: 15:09;
*/
class TestBinarySearchTree {
   public static void main(String[] args) {
       int a[] = {5, 3, 4, 1, 7, 8, 2, 6, 0, 9};
       BinarySearchTree binarySearchTree = new BinarySearchTree();
       for (int i = 0; i < a.length; i++) {
           binarySearchTree.insert(a[i]);
       }
       binarySearchTree.inOrderTree(binarySearchTree.root);
       System.out.println();
       binarySearchTree.preOrderTree(binarySearchTree.root);
       binarySearchTree.remove(7);
       System.out.println();
       System.out.println("方法一删除后");
       binarySearchTree.inOrderTree(binarySearchTree.root);
       System.out.println();
       binarySearchTree.preOrderTree(binarySearchTree.root);
   }
}

Java基础之二叉搜索树的基本操作
Java基础之二叉搜索树的基本操作

来源:https://blog.csdn.net/qq_45859087/article/details/117016847

标签:Java,二叉搜索树
0
投稿

猜你喜欢

  • 利用Intellij Idea连接远程服务器实现远程上传部署功能

    2022-05-31 13:15:54
  • Java 栈与队列实战真题训练

    2021-06-11 01:46:08
  • MyBatisPlus深入探究映射匹配的兼容性

    2023-01-08 08:57:26
  • Spring cloud网关gateway进行websocket路由转发规则配置过程

    2022-01-24 01:48:38
  • Elasticsearch配置文件示例示范

    2021-11-05 22:59:31
  • Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)

    2022-07-31 14:39:23
  • Android编程使用pull方式解析xml格式文件的方法详解

    2022-08-26 14:18:35
  • 解读Spring-boot的debug调试

    2022-06-09 15:04:06
  • mybatis foreach 循环 list(map)实例

    2023-11-23 23:39:05
  • Socket结合线程池使用实现客户端和服务端通信demo

    2023-01-21 20:23:50
  • Java简单工厂模式定义与用法实例分析

    2023-10-12 10:58:38
  • C语言枚举(enum)和联合(union)实例分享

    2023-06-17 01:56:42
  • java httpclient设置超时时间和代理的方法

    2023-05-10 13:05:24
  • Java异常 Factory method'sqlSessionFactory'rew exception;ested exception is java.lang.NoSuchMethodError:

    2022-03-25 15:06:42
  • Android仿微信微博多图展示效果

    2023-03-04 11:02:55
  • Java网络编程实例——简单模拟在线聊天

    2023-08-20 04:39:42
  • Android Webview重定向问题解决方法

    2023-10-08 01:29:19
  • Android sdutio配置Zxing进行扫码功能的实现方法

    2023-12-12 15:40:13
  • Springmvc ResponseBody响应json数据实现过程

    2022-06-12 15:22:30
  • java实现的n*n矩阵求值及求逆矩阵算法示例

    2022-07-19 06:45:06
  • asp之家 软件编程 m.aspxhome.com