一、二叉搜索树的概念
二叉搜索树又称二叉排序树,它或者是一颗空树,或者是具有一下性质的二叉树:
- 若它的左子树不为空,则左子树上所有结点的值都小于根节点
- 若它的右子树不为空,则右子树上所有结点的值都大于根节点
- 它的左右子树也分别为二叉搜索树
- 该树上没有值相同的结点
二、二叉搜索树的查找
2.1文字描述
- 判断根节点是否为空,若不为空
- 若不为空,则如果根节点值等于要查找的值 则返回根节点
- 若根节点的值大于要查找的值 则在根节点的左子树中找
- 若根节点的值小于要查找的值 则在根节点的右子树中找
- 否则返回null
2.2代码实现
public TreeNode findVal(int val) {
TreeNode cur=root;
while(cur!=null){
if(val==cur.val){
return cur;
}else if(val>cur.val){
cur=cur.right;
}else if(val<cur.val){
cur=cur.left;
}
}
return null;
}
三、二叉搜索树的插入
3.1文字描述
- 将要插入的值 实现为TreeNode结点 (node)
- 根节点若为空则root=node
- 创建两个结点cur、parent parent为cur的父节点
- 遍历二叉排序树直到cur 为空 parent先指向当前结点后, 若val>cur.val 则cur 向右走,若val<cur.val 则cur 向左走
- 最后判断插入的parent的左结点还是右结点
3.2代码实现
public void insert(int val){
TreeNode node=new TreeNode(val);
if(root==null){
root=node;
return;
}
TreeNode cur=root;
TreeNode parent=null;
while(cur!=null){
parent=cur;
if(cur.val==val){
return;
}else if(val>cur.val){
cur=cur.right;
}else if(val<cur.val){
cur=cur.left;
}
}
if(val<parent.val){
parent.left=node;
}else if(val>parent.val){
parent.right=node;
}
}
四、二叉搜索树的删除
4.1文字描述
- 设待删除结点为 cur, 待删除结点的双亲结点为 parent
-
cur.left == null 1.cur 是 root,则 root = cur.right 2.cur 不是 root,cur 是 parent.left,则 parent.left = cur.right 3.cur 不是 root,cur 是 parent.right,则 parent.right =cur.right -
cur.right == null 1.cur 是 root,则 root = cur.left 2.cur 不是 root,cur 是 parent.left,则 parent.left = cur.left 3.cur 不是 root,cur 是 parent.right,则 parent.right = cur.left -
cur.left != null && cur.right != null 1.需要使用替换法进行删除,即在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点中,再来处理该结点的删除问题
- 以B情况为例进行代码的实现
4.2代码实现
public void remove(int key) {
TreeNode cur = root;
TreeNode parent = null;
while (cur != null) {
if(cur.val < key) {
parent = cur;
cur = cur.right;
}else if(cur.val == key){
removeNode(parent,cur);
return;
}else {
parent = cur;
cur = cur.left;
}
}
}
private void removeNode(TreeNode parent,TreeNode cur) {
if(cur.left == null) {
if(cur == root) {
root = cur.right;
}else if(cur == parent.left) {
parent.left = cur.right;
}else {
parent.right = cur.right;
}
}else if(cur.right == null) {
if(cur == root) {
root = cur.left;
}else if(cur == parent.left) {
parent.left = cur.left;
}else {
parent.right = cur.left;
}
} else {
TreeNode tp=cur;
TreeNode tar=cur.right;
while(tar.left!=null){
tp=tar;
tar=tar.left;
}
cur.val=tar.val;
if(tar==tp.left){
tp.left=tar.right;
}
if(tar==tp.right){
tp.right=tar.right;
}
}
}
|