• 【数据结构】二叉搜索树


    目录

    一、概念

    二、搜索二叉树的查找

    三、搜索二叉树的插入

    四、二叉搜索树的删除

    五、性能分析


    一、概念

    二叉搜索树又称二叉排序树,他可以是一根空树,或者满足以下性质的二叉树:

    若左子树不为空,则左子树上所有节点的值小于根节点的值。

    若右子树不为空,则右子树上所有节点的值大于根节点的值。

    他的左右子树也分别为二叉搜索树。

    1. public class BinarySearch {
    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. // 需要告诉二叉搜索树的根
    11. public TreeNode root;
    12. }

    二、搜索二叉树的查找

    1. public TreeNode search2(int val){
    2. TreeNode cur = root;
    3. while (cur != null){
    4. if(cur.val == val){
    5. return cur;
    6. }else if(cur.val > val){
    7. // 比根节点小,在根节点的左边找
    8. cur = cur.left;
    9. }else{
    10. // 比根节点大,在根节点的右边找
    11. cur = cur.right;
    12. }
    13. }
    14. return null;
    15. }

    三、搜索二叉树的插入

    1. public void insert(int val){
    2. if(root == null){
    3. root = new TreeNode(val);
    4. }
    5. TreeNode parent = root;
    6. TreeNode cur = root;
    7. while (cur != null){
    8. if(cur.val > val){
    9. parent = cur;
    10. cur = cur.left;
    11. }else{
    12. parent = cur;
    13. cur = cur.right;
    14. }
    15. }
    16. // 走到这,parent就是待插入节点的根节点,
    17. TreeNode node = new TreeNode(val);
    18. if(parent.val > val){
    19. // 比根节点小,就插在根节点的左边
    20. parent.left = node;
    21. }else{
    22. parent.right = node;
    23. }
    24. }

    四、二叉搜索树的删除

    分三种情况考虑:

    第一种:待删除节点的左节点是空的

     第二种:待删除节点的右节点是空的

     第三种:待删除节点的左右节点都不为空

    不是直接删除,直接删除需要修改很多指向。采用的方法是“替死鬼”

    step1:先找到待删除节点右边最小的节点target

    step2:交换target和cur的value

    step3:删除target

     

     

    1. /**
    2. *
    3. * @param parent 待删除节点的父亲节点
    4. * @param cur 待删除节点,
    5. */
    6. private void remove(TreeNode parent, TreeNode cur) {
    7. // 分三种情况 cur.left == null cur.right == null cur的左和右都不为空
    8. if(cur.left == null){
    9. if(root == cur){
    10. root = cur.right;
    11. }else if(cur == parent.left){
    12. parent.left = cur.right;
    13. }else if(cur == parent.right){
    14. parent.right = cur.right;
    15. }
    16. }else if(cur.right == null){
    17. if(root == cur){
    18. root = cur.left;
    19. }else if(cur == parent.left){
    20. parent.left = cur.left;
    21. }else if(cur == parent.right){
    22. parent.right = cur.left;
    23. }
    24. }else{
    25. TreeNode target = cur.right;
    26. TreeNode tParent = cur;
    27. // parent向左走,找到cur的右子树的最小值
    28. while (target.left != null){
    29. tParent = target;
    30. target = target.left;
    31. }
    32. // 走到这 target的left == null tagert是最小的值
    33. // 交换值
    34. cur.val = target.val;
    35. // 找到cur的右子树没有左子树
    36. if(target == tParent.right){
    37. tParent.right = target.right;
    38. }else{
    39. tParent.left = target.right;
    40. }
    41. }
    42. }

     五、性能分析

    最优情况下,二叉搜索树为完全二叉树,其平均比较次数为: logN
    最差情况下,二叉搜索树退化为单支树,其平均比较次数为: N/2
    Java中利用搜索树实现的Map和Set。实际上使用的是红黑树

    红黑树是一根近似平衡的二叉搜索树,即在二叉搜索树的基础上+颜色和红黑树性质验证

  • 相关阅读:
    谣言检测()《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》
    品类超全的免费API接口整理分享
    VMWare不使用简易安装,手动安装ISO操作手册
    算法与数据结构【30天】集训营——二叉排序树的创建、查找、插入、删除操作(15)
    Linux串口编程进阶
    数据结构——树
    在vue中this.$refs是干什么的?
    【Elasticsearch】结合Postman/ApiPost 快速入门
    内网隧道代理技术(二十四)之 ICMP隧道介绍
    成集云 | 药师帮集成英克ERP接口 | 解决方案
  • 原文地址:https://blog.csdn.net/weixin_44258092/article/details/126447391