二叉搜索树
1 定义
二叉搜索树,也称为二叉查找树或者二叉排序树。假设节点node是二叉搜索树中的某个结点,结点node包含左右指针和数据值x,如果node结点的左结点上存在left结点(数据值为y),则y值小于x值,如果node结点的右结点上存在right结点(数据值为z),则z值大于x值。因为这个特性,它经常用于二分查找。
2 性质
- 若树中任意结点的左子树不为空,则左子树上的所有结点的值均小于该结点的值;
- 若树中任意结点的右子树不为空,则右子树上的所有结点的值均大于该结点的值;
- 树中任意结点的左、右子树都为二叉搜索树;
3 结点结构
二叉搜索树的结点结构跟普通二叉树结点一样,拥有左孩子的指针,右孩子的指针以及数据域
。可以用下面的图来表示:
Java代码定义为:
class TreeNode<T> {
TreeNode<T> leftNode;
TreeNode<T> rightNode;
T nodeValue;
public TreeNode(T object) {
this.nodeValue = object;
}
}
4 创建二叉搜索树
首先给出一个无序的数组int[] num = {11,10,9,22,13,30,17},我们以这个无序数组为例建立一个二叉搜索树:
第一步:i = 0,num[0]=11,二叉搜索树为空树,则根节点为11;
第二步:i = 1,num[1]=10,与根结点11比较,小于根结点且根结点的左子树为空,则作为根结点的左结点;
第三步:i = 2, num[2]=9,小于根结点11且左结点不为空,继续与根结点的左结点10比较,小于10且该结点的左结点为空,则作为10的左结点;
第四步:i = 3,num[3]=22,大于根节点11且根结点的右结点为空,则作为根结点的右结点;
第五步:i = 4,num[4]=13,大于根结点11且根结点的右结点不为空,小于根结点的右结点,且其左结点为空,则作为根结点的右结点的左结点;
第六步:i = 5,num[5]= 30,大于根节点11且根结点的右结点不为空,大于根结点的右结点,且其右结点为空,则作为根结点的右结点的右结点;
第七步:i = 6,num[6]=17,大于根结点11且根结点的右结点不为空,小于根结点的右结点,且其左结点不为空,大于其左结点且其左结点的右结点为空,则作为根结点的右结点的左结点的右结点;
则其最后的二叉树为:
注意:二叉搜索树的中序遍历就是一个排序的数组。
用Java代码实现整个插入的过程:
/**
* 二叉搜索树插入
* @param value
*/
public void insert(Integer value) {
TreeNode<Integer> node = new TreeNode<Integer>(value);
if (rootNode == null) {
rootNode = node; // 赋值根结点
return;
}
TreeNode<Integer> currentNode = rootNode;
TreeNode<Integer> parentNode = rootNode;
boolean isLeftNode = false;
while (currentNode != null) {
parentNode = currentNode;
if ((int)value > (int)parentNode.nodeValue) {
currentNode = currentNode.rightNode; // 大于当前节点的值则往右子树查找
isLeftNode = false;
} else if ((int