1 二叉排序树概念
二叉查找树 又叫 二叉排序树,二叉搜索树。Binary Search Tree(BST)
- 对于二叉查找树中的每一个节点如果存在左节点,左节点的值一定小于该节点的值
- 对于二叉查找树中的每一个节点如果存在右节点,右节点的值一定大于该节点的值
- 也就是说对于二叉查找树中的任何一个非叶子节点,左节点值小于当前节点值,右节点值大于当前节点值
- 二叉查找树的任何一个非叶子节点的左子树中的任何一个节点的值都要小于当前节点值,右子树中的任何一个节点的值都要大于当前节点值。
- 如果对二叉查找树进行中序遍历,可以得到一个从小到大的序列 ,所以也叫作二叉排序树
下图所示为一棵二叉查找树
优点
- 二叉排序树是一种比较有用的折衷方案。
- 数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。
- 链表与之相反,删除和插入元素很快,但查找很慢。
- 二叉排序树就既有链表的好处,也有数组的好处。
- 在处理大批量的动态的数据是比较有用。
2基本思路
树的创建和添加:
root为空则root设置为新添加的节点,不为空 就比较当前节点和需添加进来的节点值,若新的节点值小于当前节点则接着与左节点比较,如果当前节点的左节点为空,则将新节点设置为当前节点的左节点,左节点不为空,接着与左节点比较。。。。若新的节点值大于当前节点则接着与右节点比较,如果当前节点的右节点为空,则将新节点设置为当前节点的右节点,右节点不为空,接着比较下去。
树的删除: 分为四种情况
- 树只由一个根节点构成 删除时要判断父节点为空&&左节点为空&&右节点为空
- 要删除的节点没有左和右节点 删除只需要将父节点的指向该节点的引用设置为null
- 要删除的节点只有一个节点 将要删除的节点的子节点设置为父节点相应的子节点
- 需要删除的节点有两个子节点 将要删除节点的右子树中的最小值节点替换要删除的节点,如果最小值节点有右节点的 话,并将最小值节点的右节点设置为其父节点相应子节点 或者 将左子树中的最大值节 点替换要删除的节点,如果最大值节点有左节点,并将最大值节点的左节点设置为其父节 点相应的子节点。
注:第四种情况最小(大)节点替换被删除节点时 不仅value要被替换,count也要被替换 ,否则count值将会被保留
2代码实现
节点类
package com.sorttree;
/**
* @Author WYMY
*
*/
public class Node {
int value;
Node left;
Node right;
//如果节点重复count+1 没有重复count=0
int count=0;
public Node(int value) {
this.value = value;
}
//节点添加 递归
public void add(Node node) {
if (null == node) {
return;
}
//新添加的节点值小于当前节点值
if (node.value < this.value) {
if (this.left == null) {
this.left = node;
} else {
this.le