【数据结构与算法】树:二叉排序树
二叉排序树介绍
二叉排序树(Binary Sort/Search Tree):对于二叉排序树的任意一个非叶子节点,左子节点的值比当前节点的值小,右子节点的值比当前节点的值大。
==如果值相同,该节点可以放在左子节点或右子节点==
示例:
复杂度:
不论哪一种操作,所花的时间都和树的高度成正比。因此,如果共有n个元素,那么平均每次操作需要**O(logn)**的时间。
二叉排序树的实现
1. 二叉排序树的创建
构建(就是普通的二叉树)
1
2
3
4
5
6
7
8
9
10
11
12public class BinarySearchTree {
private TreeNode root;
public TreeNode getRoot() {
return root;
}
public void setRoot(TreeNode root) {
this.root = root;
}
}1
2
3
4
5
6
7public class TreeNode {
int value; //节点属性值
TreeNode left; //左子节点
TreeNode right; //右子节点
}插入
思路:1. 比较插入节点的值与当前节点的值来决定插入位置是左子节点还是右子节点
2. 插入的左子节点为空,则将插入节点设置为左子节点;不为空,则进行递归
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30//TreeNode:
//添加节点操作
public void add(TreeNode treeNode) {
//先判断加入的节点是否为空
if (treeNode == null) {
return;
}
//当加入节点的值小于当前节点的值时,考虑左子节点
if (treeNode.value < this.value) {
if (this.left == null) {
this.left = treeNode;
} else {
this.left.add(treeNode);
}
} else { //当加入节点的值大于当前节点的值时,考虑右子节点
if (this.right == null) {
this.right = treeNode;
} else {
this.right.add(treeNode);
}
}
}
//BinarySearchTree:
public void add(TreeNode treeNode) {
if (root == null) {
return;
}
root.add(treeNode);
}
2. 二叉排序树的删除
思路分析:
删除叶子节点:
找到要删除的节点 targetNode
找到要删除的节点的父节点 parentNode
确定 targetNode 是 parentNode 的左子节点还是右子节点
(如果是左子节点)
parentNode.left = null
(如果是右子节点)
parentNode.right = null
删除只有一颗子树的节点
找到要删除的节点 targetNode
找到要删除的节点的父节点 parentNode
确定 targetNode 是 parentNode 的左子节点还是右子节点
是左子节点且有左子节点:
是左子节点且有右子节点:
是右子节点且有左子节点:
是右子节点且有右子节点:
删除有两颗子树的节点:
找到要删除的节点 targetNode
找到 targetNode 的父节点 parentNode
找到 targetNode 节点 左子节点,向右递归找到最大的节点 tempNode(没有右子节点就是targetNode的左子节点本身)
或者
找到 targetNode节点 右子节点,向左递归找到最小的节点 tempNode(没有左子节点就是targetNode的右子节点本身)
targetNode.value = tempNode.value
删除tempNode节点
代码实现:
1 | //TreeNode: |
1 | //BinarySearchTree: |