目录
1.什么是二叉排序树
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。
二叉排序树特点:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
扫描二维码关注公众号,回复:
11388711 查看本文章
(4)没有键值相等的结点。
简单说,就是每个父节点大于当前节点的左子节点,小于当前节点的右子节点。
2.构建二叉排序树的思路
以下讲解将一个数组转为二叉排序树的思路:
- 添加子节点的时候,如果二叉树的root节点为null,则该节点为root节点
- 如果root节点不为null,进行以下步骤
- 如果子节点(即新增节点)的值小于该节点(第一次为root节点,后续为当前节点),分两种情况:
3.1 如果该节点的左子节点为null,则将新增节点做为当前节点的左子节点
3.2 如果该节点的左子节点不为null,则将当前节点的左子节点作为父节点,重复 2-3-4步骤
4. 如果子节点的值不小于该节点的值,分两种情况:
4.1、如果该节点的右子节点为null,则将新增节点作为当前节点的右子节点
4.2、如果该节点的右子节点不为null,则将当前节点的右子节点作为父节点,重复 2-3-4步骤
具体实现可参考以下代码
3.代码实现
/**
* @author 浪子傑
* @version 1.0
* @date 2020/5/31
*/
public class BinarySearchTreeDemo {
public static void main(String[] args) {
BinarySearchTree binarySearchTree = new BinarySearchTree();
int[] arr = {7, 3, 10, 12, 5, 1, 9};
for (int i : arr) {
Node node = new Node(i);
binarySearchTree.add(node);
}
binarySearchTree.infixOrder();
}
}
class BinarySearchTree {
private Node root;
/**
* 添加子节点
*
* @param node
*/
public void add(Node node) {
if (root == null) {
root = node;
} else {
root.add(node);
}
}
/**
* 中序遍历
*/
public void infixOrder() {
if (root != null) {
root.middleOrder();
} else {
System.out.println("当前root为空");
}
}
}
class Node {
private int value;
private Node left;
private Node right;
public Node(int value) {
this.value = value;
}
/**
* 添加节点
*
* @param node
*/
public void add(Node node) {
// 如果该节点为null,直接返回
if (node == null) {
return;
}
// add的节点小于当前节点,说明应该在当前节点的左边
// 否则放在当前节点的右边
if (node.value < this.value) {
// 如果当前节点的左边没有子节点,则直接把add节点放在当前节点的左子节点
// 否则的话,遍历当前左子节点,直到找到合适位置
if (this.left == null) {
this.left = node;
} else {
this.left.add(node);
}
} else {
if (this.right == null) {
this.right = node;
} else {
this.right.add(node);
}
}
}
/**
* 中序遍历
*/
public void middleOrder() {
if (this.left != null) {
this.left.middleOrder();
}
System.out.println(this);
if (this.right != null) {
this.right.middleOrder();
}
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
}
4.待办
1、二叉排序树的节点删除
2、二叉排序树的优化,即平衡二叉树