二叉搜索树
概念
右子树上所有节点的值均大于根节点的值
左子树上所有结点的值均小于根节点的值
他的左右子树也分别为二叉搜索树
操作
查找(target)
-
若根节点不为空
- 若根节点.key == target,返回true
- 若根节点.key > target,在左子树查找
- 若根节点.key < target,在右子树查找
-
若根节点为空,返回false
//查找
public static boolean search(int target) {
if (root == null) { //加了static root 不可用了
return false;
}
TreeNode cur = root;
while (cur != null) {
if (cur.key == target) {
return true;
} else if (cur.key > target) {
cur = cur.left;
} else {
cur = cur.right;
}
}
return false;
}
插入(key,value)
-
若根节点为空
- 直接插入
-
若根节点不为空
-
遍历
- 若cur.key == key,返回
- 若cur.key > key,当前节点标记为父节点,进入左子树
- 若cur.key < key,当前节点标记为父节点,进入右子树
-
判断
- 若parent.key>key,该节点插入到左子树中
- 否则插入到右子树中
-
//建树
public static void insert(int key, int val) {
TreeNode node = new TreeNode(key, val);
if (root == null) {
root = node;
return;
}
TreeNode parent = null;
TreeNode cur = root;
while (cur != null) {
if (cur.key == key) {
//该节点已存在
return;
} else if (cur.key > key) {
parent = cur;
cur = cur.left;
} else {
parent = cur;
cur = cur.right;
}
} //循环结束后,cur == null
if (key < parent.key) {
parent.left = node;
} else {
parent.right = node;
}
}
删除(key)
-
遍历找到待删除结点为cur,其双亲为parent
-
cur.left == null
-
cur == root --> root = cur.right
-
cur != root && cur == parent.left --> parent.left = cur.right
-
cur != root && cur == parent.right --> parent.right = cur.right
-
-
cur.right == null
-
cur == root --> root = cur.left
-
cur != root && cur == parent.left --> parent.left = cur.left
-
cur != root && cur == parent.right --> parent.right = cur.left
-
-
cur.left != null && cur.right != null
- 找替罪羊:找右子树最左侧元素 or 找左子树最右侧元素
- 赋值:待删结点的值为替罪羊的值
- 删去替罪羊:goatParent._ = goat._
-