===================================================================

一、二叉搜索树(BSTree)的概念

       二叉搜索树又被称为二叉排序树,那么它本身也是一棵二叉树,那么满足以下性质的二叉树就是二叉搜索树:
       1、若左子树不为空,则左子树上左右节点的值都小于根节点的值
       2、若它的右子树不为空,则它的右子树上所有的节点的值都大于根节点的值
       3、它的左右子树也要分别是二叉搜索树
===================================================================

二、二叉搜索树的插入

  1、搜索
       插入之前我们先来说说它的搜索,像上图这样的一棵二叉搜索树,我们要查找某一个元素是很简单的。因为它的节点分布是有规律的,所以查找一棵元素只需要如下的步骤就可以了:
        
       2、插入
       由于二叉搜索树的特殊性质确定了二叉搜索树中每个元素只可能出现一次,所以在插入的过程中如果发现这个元素已经存在于二叉搜索树中,就不进行插入。
否则就查找合适的位置进行插入。
第一种情况:_root为空
直接插入,return  true;
第二种情况:要插入的元素已经存在
如上面所说,如果在二叉搜索树中已经存在该元素,则不再进行插入,直接return  false;
第三种情况:能够找到合适位置
===================================================================

三、二叉搜索树的删除

对于二叉搜索树的删除操作,主要是要理解其中的几种情况,写起来还是比较简单的。
当然一开始还是需要判断要删除的节点是否存在于我们的树中,如果要删除的元素都不在树中,就直接返回false;否则,再分为以下四种情况来进行分析:
     》要删除的节点无左右孩子
     》要删除的节点只有左孩子
     》要删除的节点只有右孩子
     》要删除的节点有左、右孩子
 
删除方法解释:
     对于第一种情况,我们完全可以把它归为第二或者第三种情况,就不用再单独写一部分代码进行处理;
     》如果要删除的节点只有左孩子,那么就让该节点的父亲结点指向该节点的左孩子,然后删除该节点,返回true;
          
     》如果要删除的节点只有右孩子,那么就让该节点的父亲结点指向该节点的右孩子,然后删除该节点,返回true;
            
          对于上面这两种情况我们还应该在之前进行一个判断,就是判断这个节点是否是根节点,如果是根节点的话,就直接让根节点指向这个节点的左孩子或右孩子,然后删除这个节点。
       》最后一种也是最麻烦的一种就是要删除的节点的左右孩子都存在。此时我们的删除方法如下:
           1、找到该节点的右子树中的最左孩子(也就是右子树中序遍历的第一个节点)
           2、把它的值和要删除的节点的值进行交换
           3、然后删除这个节点即相当于把我们想删除的节点删除了,返回true;
===================================================================
程序代码:
1、二叉搜索树的插入操作
 1  bool Insert(const K& key)
 2     {
 3         if (_root == NULL)
 4         {
 5             _root = new Node(key);
 6             return true;
 7         }
 8         Node* parent=NULL;
 9         Node* pcur = _root;
10         while (pcur)
11         {
12             if (pcur->_key == key)  //有key节点,则不再插入
13                 return false;
14             if (pcur->_key > key)
15             {
16                 parent = pcur;
17                 pcur = pcur->_left;
18             }
19             else if (pcur->_key < key)
20             {
21                 parent = pcur;
22                 pcur = pcur->_right;
23             }
24         }
25         if (parent->_key < key)
26             parent->_right = new Node(key);
27         else
28             parent->_left = new Node(key);
29         return true;
30     }

2、二叉搜索树的删除操作 bool Remove(const K& key)

 1 bool Remove(const K& key)
 2     {
 3         assert(_root);
 4         Node* parent = NULL;
 5         Node* pcur = _root;
 6         Node* del = pcur;
 7         while (pcur != NULL  && pcur->_key != key)
 8         {
 9             if (pcur->_key > key)
10             {
11                 parent = pcur;
12                 pcur = pcur->_left;
13             }
14             else if (pcur->_key < key)
15             {
16                 parent = pcur;
17                 pcur = pcur->_right;
18             }
19         }
20         if (pcur == NULL)
21             return false;
22         if (pcur->_left == NULL)      //只有右孩子
23         {
24             //如果pcur就是根节点的话,让根节点指向根的右
25             if (pcur == _root)
26                 _root = pcur->_right;
27             else if (pcur == parent->_left)
28             {
29                 parent->_left = pcur->_right;
30             }
31             else
32             {
33                 parent->_right = pcur->_right;
34             }
35             del = pcur;
36         }
37         else if (pcur->_right == NULL)     //只有左孩子
38         {
39            //如果是根节点,让根节点指向根的左
40             if (pcur == _root)
41                 _root = pcur->_left;
42             else if (parent->_left == pcur)
43             {
44                 parent->_left = pcur->_left;
45             }
46             else
47                 parent->_right = pcur->_left;
48             del = pcur;
49         }
50         //pcur左右孩子都不为空
51         else
52         {
53            //找到节点右子树的最左节点
54             Node* left = pcur->_right;
55             parent = pcur;
56             while (left->_left)
57             {
58                 parent=left;
59                 left = left->_left;
60             }
61             del = left;
62             pcur->_key = left->_key;   //交换节点的值
63             if (parent->_left == left)
64             {
65                 parent->_left = left->_right;
66             }
67             else
68             {
69                 parent->_right = left->_right;
70             }
71
72         }
73         delete del;
74         return true;
75     }

转载于:https://www.cnblogs.com/MrListening/p/5782752.html

二叉搜索树的插入与删除图解相关推荐

  1. 二叉搜索树的插入与删除(C语言)

    代码如下: BinTree Insert( BinTree BST, ElementType X ) {if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */BST = (Bi ...

  2. 二叉搜索树的插入、删除、修剪、构造操作(leetcode701、450、669、108)

    目录 1.leetcode 701. 二叉搜索树中的插入操作 1.题目 2.递归法 3.迭代法 2.leetcode 450. 二叉搜索树中的插入操作 1.题目 2.思路+递归法 3.迭代法 4.删除 ...

  3. 二叉搜索树的插入,删除,和中序遍历

    构建一个值的类型为int的二叉搜索树,输入N和M,然后进行N次插入操作,每次插入之后进行一次遍历验证代码正确性.然后进行M次删除操作,每次删除之后进行一次遍历验证代码正确性. #include &qu ...

  4. 二叉搜索树(创建,插入,删除):基础篇,适合新手观看。

    1.1 二叉搜索树的插入 二叉搜索树的概念相信大家都很清楚,无非就是左小右大 创建二叉搜索树,其实就是多次调用二叉搜索树的插入方法,所以首先我们来讲讲如何插入节点到二叉搜索树里,假设一颗二叉搜索树如下 ...

  5. 二叉平衡树的插入和删除操作

    [转载]二叉平衡树的插入和删除操作 1.      二叉平衡树 二叉排序树查找.插入和删除操作的时间复杂度和树的深度n有关.构建树时,当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长 ...

  6. 二叉搜索树的创建以及删除

    #include <stdio.h> #include <stdlib.h> #define EOR -1typedef int EleType;//typedef 定义存放数 ...

  7. 二叉堆(插入、删除)

    二叉堆分为大顶堆和小顶堆,是一颗完全二叉树.但是实际上的存储一般用数组存储. 大顶堆:任何父节点都比子节点大,但左右子节点大小情况任意. 小顶堆:任何父节点都比子节点小,但左右子节点大小情况任意. t ...

  8. 二叉搜索树(BST)删除节点--思路清晰

    前言:在学习BST时,发现查找插入等操作都很好理解和实现,而删除节点的操作情况比较复杂,故通过自己的理解整理如下,本文适合初学者理解并自己动手实现BST删除操作. 在很多文章中提到,删除节点可以考虑以 ...

  9. leetcode 701 二叉搜索树的插入操作 C++ 递归和迭代

    迭代 class Solution {public:TreeNode* insertIntoBST(TreeNode* root, int val) {if(!root) return new Tre ...

最新文章

  1. pythonweb开发-一步步教你开始使用Python开发Web应用
  2. Java反射 - 2(对象复制,父类域,内省)
  3. 面向任务的 Git 学习法
  4. CenterOs 防火墙设置
  5. 微信公招访问我服务器的那个端口,查看谁在使用某个网络端口
  6. 技术人员要分出2成精力防范内斗及斗争方法
  7. 容器就业市场持续增长,5条建议让您快速掌握Docker技能
  8. chrome官网下载离线安装包
  9. 中冠百年|到了30岁应该如何增加收入?
  10. 视觉中国,董事长是加拿大籍,总裁是美国籍
  11. T0.Games欢迎高端加密NFT入驻
  12. bi 工具 市场排行榜_bi工具市场排行榜,国内BI软件排名
  13. Windows 7 插件KB4474419安装 Symantec Endpoint Protection 只能安装在具有SHA-2代码签名支持更新(KB4474419)的系统上
  14. 基片集成波导天线设计基础
  15. 管理之路:你的格局,决定你的结局
  16. python模拟预测孩子身高_这个公式可以帮你预测你家孩子身高
  17. (1)大数据和应用场景介绍
  18. 抖音一般多久能上热门 视频修改MD5工具
  19. scanpy 单细胞分析包图文详解 01 | 深入理解 AnnData 数据结构
  20. linux centos 解压 tar.bz2文件

热门文章

  1. sim卡rfm_信用卡客户的RFM集群
  2. TCP流量控制与拥塞控制区别
  3. 华为手机销量超过苹果,华为能算是全球第二大手机厂家吗?
  4. 作家百态之二:山南海北
  5. python生成奇数列表_python3:列出一个不需要迭代的奇数列表
  6. java单列_Java 单例模式
  7. pathon和python_Python文件和目录操作详解
  8. 华为2014校园招聘的机试题目
  9. 【TensorFlow-windows】学习笔记五——自编码器
  10. 人工智能泰斗迈克尔·乔丹分享机器学习要义:创新视角,直面挑战