树
public class BinarySearchTree {
static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
public TreeNode root;
}
一:寻找节点
1. 要求: public TreeNode search(int key) 查找key是否在
2. 思路: 搜索二叉树——其节点左侧的值都小于 根结点的值,节点右侧的值都大于 根节点的值 可以利用这点来进行判断 - 根结点的值小于key-往根节点右侧去寻找(根结点的值大于key-往根节点左侧去寻找)
3. 代码:
public TreeNode search(int key){
TreeNode cur = root;
while(cur != null){
if (cur.val > key){
cur = cur.left;
}else if(cur.val < key){
cur = cur.right;
}else {
return cur;
}
}
return null;
}
二:插入节点
1. 要求:public boolean insert(int key) 往里面插入一个数据key
2. 思路:
看下面的图:如果给你一棵树往里插节点,你思考一下,你要插得节点最后都在原来的树的什么位置?——叶子位置——所以你要找到其原来树节点的.left/.right==null 的点
第一-这棵树是空树-空树直接让这个数据为根 第二-寻找位置利用cur=root,p=null,当cur!=null-判断其与key的大小(大或者小 p=cur,cur=cur.left / right)(相等 则返回false 不能有相同的数据)-直到cur==null-key与p.val比较看是插p的左还是右
3.代码:
public boolean insert(int key){
TreeNode node = new TreeNode(key);
if(root == null){
root = node;
return true;
}
TreeNode cur = root;
TreeNode p = null;
while(cur != null){
if (cur.val > key){
p = cur;
cur = cur.left;
}else if(cur.val < key){
p = cur;
cur = cur.right;
}else {
return false;
}
}
if(p.val > key){
p.left = node;
}else {
p.right = node;
}
return true;
}
4. 看图走一遍:
三:删除节点
1. 要求: public void remove(int key) 删除值为key的节点
2. 思路:
是否能找到节点cur——删除的节点左边为空 、删除的节点右边为空、删除的节点左边右边都不为空
删除的节点cur左边为空——cur==root -> root = cur.right 、cur==p.left ->p.left=cur.right 、cur==p.right
删除的节点cur右边为空——和上面的差不多
删除的节点左边右边都不为空——这是时候你可以选 右边找最小值,(左边找最大值)——找到了把他的值cur给你要删除的节点——判断cur是p.left / p.right——再将其=cur.right
3. 代码:
public void remove(int key){
TreeNode cur = root;
TreeNode p = null;
while(cur != null){
if (cur.val > key){
p = cur;
cur = cur.left;
}else if(cur.val < key){
p = cur;
cur = cur.right;
}else {
removeNode(cur,p);
return;
}
}
}
private void removeNode(TreeNode cur,TreeNode p){
if(cur.left == null){
if(cur == root){
root = cur.right;
}else if(cur == p.left){
p.left = cur.right;
}else {
p.right = cur.right;
}
}
else if(cur.right == null){
if(cur == root){
root = cur.left;
}else if(cur == p.right){
p.right = cur.left;
}else {
p.left = cur.left;
}
}
else {
TreeNode target = cur.right;
TreeNode targetParent = cur;
while(target.left != null){
targetParent = target;
target = target.left;
}
cur.val = target.val;
if(targetParent.left == target){
targetParent.left = target.right;
}else {
targetParent.right = target.right;
}
}
}
public void inorderNode(TreeNode root){
if(root == null) return;
inorderNode(root.left);
System.out.print(root.val+" ");
inorderNode(root.right);
}
4. 看图走一遍