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);
}
}
来源: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