二叉搜索树:又叫二叉排序树,二叉查找树。
定义:或者是一棵空树,或者是具备以下特性的非空数:若它的左子树不为空,那么左子树上的结点的值均小于根结点的值;若它的右子树不为空,则右子树上的结点的值均大于根结点的值。下面来看二叉搜索树的具体操作
1、创建
使用递归算法,确定一个根结点,然后比根结点小的放左边,大的放右边,具体代码实现如下
public static TreeNode SortBinaryTree(TreeNode node, int i) {
if(node == null) {
node = new TreeNode(i);
return node;
} else {
if(i <= node.val) {
node.left = SortBinaryTree(node.left, i);
} else {
node.right = SortBinaryTree(node.right, i);
}
}
return node;
}
测试,利用中序遍历,看中序遍历后是否是递增的序列,代码如下
public static void inorder(TreeNode root) {
if(root != null) {
inorder(root.left);
System.out.println(root.val);
inorder(root.right);
}
}
public static void main(String[] args) {
int[] arr = {0, 9, 4, 2, 6};
TreeNode root = new TreeNode(arr[0]);
for(int i = 1; i < arr.length; i++) {
SortBinaryTree(root, arr[i]);
}
inorder(root);
}
测试结果
2、查找结点
将给定值与根结点对比,若小于根结点的值,则与根的左子树比较,若大于根结点的值,则与根的右子树对比,具体代码如下。
public TreeNode find(TreeNode root, int key) {
TreeNode p = root;
while(p != null && p .val != key) {
if(key < p.val) {
p = p.left;
} else {
p = p.right;
}
}
if(p == null) {
return null;
}
return p;
}
3、插入结点
类似查找,只是需要查找至左子树或者右子树为空的位置进行插入,来看代码
public void insert(TreeNode root, int key) {
if(root == null) {
root = new TreeNode(key);
return;
}
TreeNode p = root;
TreeNode parent = root;
boolean isLeftChild = true;
while(p != null) {
parent = p;
if(key < p.val) {
p = p.left;
isLeftChild = true;
} else {
p = p.right;
isLeftChild = false;
}
}
TreeNode newNode = new TreeNode(key);
if(isLeftChild) {
parent.left = newNode;
} else {
parent.right = newNode;
}
}