- 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. 看图走一遍

