• 搜索二叉树——寻找节点,插入节点,删除节点


    1. public class BinarySearchTree {
    2. static class TreeNode {
    3. public int val;
    4. public TreeNode left;
    5. public TreeNode right;
    6. public TreeNode(int val) {
    7. this.val = val;
    8. }
    9. }
    10. public TreeNode root;
    11. }

    一:寻找节点

    1. 要求: public TreeNode search(int key) 查找key是否在

    2. 思路: 搜索二叉树——其节点左侧的值都小于 根结点的值,节点右侧的值都大于 根节点的值 可以利用这点来进行判断 - 根结点的值小于key-往根节点右侧去寻找(根结点的值大于key-往根节点左侧去寻找)

    3. 代码:

    1. public TreeNode search(int key){
    2. TreeNode cur = root;
    3. while(cur != null){
    4. if (cur.val > key){
    5. cur = cur.left;
    6. }else if(cur.val < key){
    7. cur = cur.right;
    8. }else {
    9. return cur;
    10. }
    11. }
    12. return null;
    13. }

    二:插入节点

    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.代码:

    1. public boolean insert(int key){
    2. TreeNode node = new TreeNode(key);
    3. if(root == null){
    4. root = node;
    5. return true;
    6. }
    7. TreeNode cur = root;
    8. TreeNode p = null;
    9. while(cur != null){
    10. if (cur.val > key){
    11. p = cur;
    12. cur = cur.left;
    13. }else if(cur.val < key){
    14. p = cur;
    15. cur = cur.right;
    16. }else {
    17. return false;
    18. }
    19. }
    20. if(p.val > key){
    21. p.left = node;
    22. }else {
    23. p.right = node;
    24. }
    25. return true;
    26. }

    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. 代码:

    1. public void remove(int key){
    2. TreeNode cur = root;
    3. TreeNode p = null;
    4. while(cur != null){
    5. if (cur.val > key){
    6. p = cur;
    7. cur = cur.left;
    8. }else if(cur.val < key){
    9. p = cur;
    10. cur = cur.right;
    11. }else {
    12. removeNode(cur,p);
    13. return;
    14. }
    15. }
    16. }
    17. private void removeNode(TreeNode cur,TreeNode p){
    18. if(cur.left == null){
    19. if(cur == root){
    20. root = cur.right;
    21. }else if(cur == p.left){
    22. p.left = cur.right;
    23. }else {
    24. p.right = cur.right;
    25. }
    26. }
    27. else if(cur.right == null){
    28. if(cur == root){
    29. root = cur.left;
    30. }else if(cur == p.right){
    31. p.right = cur.left;
    32. }else {
    33. p.left = cur.left;
    34. }
    35. }
    36. else {
    37. TreeNode target = cur.right;
    38. TreeNode targetParent = cur;
    39. while(target.left != null){
    40. targetParent = target;
    41. target = target.left;
    42. }
    43. cur.val = target.val;
    44. if(targetParent.left == target){
    45. targetParent.left = target.right;
    46. }else {
    47. targetParent.right = target.right;
    48. }
    49. }
    50. }
    51. public void inorderNode(TreeNode root){
    52. if(root == null) return;
    53. inorderNode(root.left);
    54. System.out.print(root.val+" ");
    55. inorderNode(root.right);
    56. }

    4. 看图走一遍

     

     

  • 相关阅读:
    Java比较两个日期的间隔天数(案例详解)
    [ERROR] Error executing Maven.
    Knockoutjs属性绑定(Bindings)之流程控制(Control flow)
    ESP32C3 LuatOS RC522①写入数据并读取M1卡
    【附源码】计算机毕业设计JAVA房产客户信息管理系统
    17种简单有效更快地增加电子邮件列表的方法
    LeetCode 203.移除链表元素
    7.7 网络(一)
    谨慎redis的timeout参数
    测试内推 | 阿里飞猪、百度、58(招聘)、知乎、欢忻网络、百果园、阿里(Lazada)、深智城、元戎启行招人啦
  • 原文地址:https://blog.csdn.net/m0_63501066/article/details/125895487