二叉查找树
二叉树的一个重要应用就是在查找中的使用。下面,先来看一个小例子:
给你一个数列(7,3,10,12,5,1,9),要求能够高效的完成对数据的查询和添加,对数据进行这样的处理的方式有很多,例如,数组和链表。
首先,来分析数组和链表的优点和缺点
1.数组:数组可以分为两种情况(是否进行了排序):
(1)未排序数组:数组查找速度慢,添加直接添加在数组尾部,比较快
(2)已排序数组:数组查找时可以使用二分查找,查找速度较快,但是插入数据时为了保证数组有序,在插入位置之后的数据均要进行位置移动,比较缓慢。
2.链表:无论链表中的数据是否有序,查询速度都很缓慢,插入相较于有序数组快。
上图描述的就是二叉查找树的基本概念,会发现,这种树集成了有序数组和链表的优点,所以在查找和添加数据的时候会很高效。接下来,我们先来创建一棵二叉查找树。
package com.ddw.binarysorttree;
public class BinarySortTreeDemo {
public static void main(String[] args) {
int[] arr = {
7, 3, 10, 12, 5, 1, 9, 2};
BinarySortTree binarySortTree = new BinarySortTree();
//循环的添加节点到二叉排序树
for (int i = 0; i < arr.length; i++) {
binarySortTree.add(new Node(arr[i]));
}
//中序遍历二叉排序树
System.out.println("中序遍历二叉排序树");
binarySortTree.infixOrder();
//测试一下删除叶子节点
binarySortTree.delNode(7);
/* binarySortTree.delNode(3);
binarySortTree.delNode(10);
binarySortTree.delNode(12);
binarySortTree.delNode(5);
binarySortTree.delNode(1);
binarySortTree.delNode(9);
binarySortTree.delNode(2);*/
System.out.println("删除节点后");
binarySortTree.infixOrder();
}
}
//创建二叉排序树
class BinarySortTree {
private Node root;
//查找要删除的节点
public Node search(int value) {
if (root == null) {
return null;
} else {
return root.search(value);
}
}
//查找父节点
public Node searchParent(int value) {
if (root == null)