1 //与上一次实现不同,这里使用了大量的指针引用,
  2 //因此节省了一个指向父节点的指针
  3 #include<iostream>
  4 #include<vector>
  5 #include<ctime>
  6 #include<cstdlib>
  7 #include<sstream>
  8 using namespace std;
  9
 10 template<class T>
 11 class BinarySearchTree
 12 {
 13     private:
 14         struct Node
 15         {
 16             T data;
 17             Node *left;
 18             Node *right;
 19             int deep;
 20             Node(T val,int deep)
 21             {
 22                 data = val;
 23                 deep = deep;
 24                 left = NULL;
 25                 right = NULL;
 26             }
 27
 28             private:
 29             Node()
 30             {
 31             }
 32         };
 33         Node *root;
 34         int size;
 35
 36     public:
 37         BinarySearchTree()
 38         {
 39             root = NULL;
 40             size = 0;
 41         }
 42         ~BinarySearchTree()
 43         {
 44             clear(root);
 45             root = NULL;
 46             size = 0;
 47         }
 48         Node*& findMin(Node *&node) const
 49         {
 50             if(node->left == NULL)
 51                 return node;
 52             else
 53                 return findMin(node->left);
 54         }
 55
 56         void  insert(Node *&node,T val,int deep )
 57         {
 58             if(size == 0)
 59             {
 60                 root = new Node(val,0);
 61                 size++;
 62                 return;
 63             }
 64             if(node == NULL)
 65             {
 66                 node = new Node(val,deep);
 67                 size++;
 68                 return;
 69             }
 70             if(val > node->data)
 71                 insert(node->right,val,node->deep+1);
 72             else if(val < node->data)
 73                 insert(node->left,val,node->deep+1);
 74             else if(val == node->data)
 75             {
 76             }
 77         }
 78
 79         bool contain(Node *& node,T val) const
 80         {
 81             if(node == NULL)
 82                 return false;
 83
 84             if(val > node->data)
 85                 return contain(node->right,val);
 86             else if(val < node->data)
 87                 return contain(node->left,val);
 88             else
 89                 return true;
 90         }
 91
 92         void remove(Node* &node,T val)
 93         {
 94             if(node == NULL)
 95             {
 96                 cout<<"remove() error!\n";
 97                 return;
 98             }
 99             if(val > node->data)
100                 remove(node->right,val);
101             else if(val < node->data)
102                 remove(node->left,val);
103             else if(val == node->data)
104             {
105                 if(node->left == NULL && node->right == NULL)
106                 {
107                     delete node;
108                     node = NULL;
109                     size--;
110                 }
111                 else if(node->left == NULL && node->right != NULL)
112                 {
113                     Node *p = node;
114                     node = node->right;
115                     delete p;
116                     size--;
117                 }
118                 else if(node->left != NULL && node->right == NULL)
119                 {
120                     Node *p = node;
121                     node = node->left;
122                     delete p;
123                     size--;
124                 }
125                 else if(node->left != NULL && node->right != NULL)
126                 {
127                     Node* &p = findMin(node->right);
128                        node->data = p->data;
129                     Node *tmp = p;
130                     p = p->right;
131                     delete tmp;
132                     size--;
133                 }
134             }
135         }
136         void clear(Node* &node)
137         {
138             if(node->left != NULL)
139                 clear(node->left);
140             if(node->right != NULL)
141                 clear(node->right);
142
143             delete node;
144             node = NULL;
145         }
146         void print(Node *node)
147         {
148             if(node == NULL)
149                 return;
150             cout<<node->data<< " ";
151             if(node->left != NULL)
152                 print(node->left);
153             if(node->right != NULL)
154                 print(node->right);
155         }
156         void insert(T val)
157         {
158             insert(root,val,0);
159         }
160         void remove(T val)
161         {
162             remove(root,val);
163         }
164         void print()
165         {
166             print(root);
167             cout<<"\n";
168         }
169 };
170
171 int main()
172 {
173     BinarySearchTree<int> tree;
174
175     srand((unsigned int)time(0));
176     for(int i=0;i<20;i++)
177         tree.insert(rand()%100-50);
178     tree.print();
179     return 0;
180 }

转载于:https://www.cnblogs.com/jkred369/p/4616681.html

二叉查找树-优化版,使用了指针引用相关推荐

  1. C语言 --- 动态内存管理(上)+优化版通讯录+笔试题

    文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...

  2. 双重关系感知注意力机制 Dual Relation-Aware Attention[keras实现 dual attention优化版]

    文章目录 前言 一.Compat Position Attention Module紧凑型位置注意力模块 二.Compat Channel Attention Module紧凑型通道注意力模块 三.效 ...

  3. 转 FTP搜索引擎的设计与实现(优化版)

    width="336" height="280" src="http://www.zealware.com/csdnblog336280.html&q ...

  4. 通过指针引用数组(包含多种例子,清晰易懂)

    大纲浏览 ①数组元素的指针②在引用数组元素时指针的运算③通过指针引用数组元素④用数组名作函数参数⑤通过指针引用多维数组 ①数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地 ...

  5. C++基础知识 - 指针引用

    指针引用 指针变量的定义 int x = 666; int *p = &x;int* &q = p; //定义指针变量的引用 int* &q = p; 这叫做指针的引用. 不要 ...

  6. 韩顺平老师坦克大战优化版

    一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...

  7. YOLO3升级优化版!Poly-YOLO:支持实例分割!

    YOLO3升级优化版!Poly-YOLO:支持实例分割! POLY-YOLO: HIGHER SPEED, MORE PRECISE DETECTION AND INSTANCE SEGMENTATI ...

  8. 2020-09-25C++学习笔记引用2:二级指针形参与指针形参的使用方法和区别重难点,主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)

    2020-09-25C++学习笔记引用2:二级指针形参与指针引用搭配做形参的使用方法区别重难点,注意事项主看综合代码(1.指针形参2.引用形参3.二级指针形参4.指针引用形参) 1.指针引用 #inc ...

  9. 智能&大数据时代,架构师思维的十个学习步骤(优化版)

    前言: 秦朝的<书同文.车同轨>,加上唐朝的<诗同形>,有效的减法设计,创造了大一统(加法)的辉煌国度.君不见,在前面各步骤里,诸如:从复杂中设计出简单.以需求检验设计等都是基 ...

最新文章

  1. 微软系统工具套件SysinternalsSuite各个工具功能说明
  2. linux查看机器品牌信息,dmidecode查看linux硬件信息
  3. C++ class实现顺序队列(完整代码)
  4. 搜索引擎蜘蛛给网站带来的危害,有效指引爬虫对应的措施(最准确搜索引擎蜘蛛名称)...
  5. Linux内核跟踪eBPF:bpftrace 参考指南
  6. UVa 10020 (最小区间覆盖) Minimal coverage
  7. NYOJ-111分数加减法
  8. 工具说明书 - 网页内容抓取工具Web Scraper(一)
  9. 批处理之 FOR循环
  10. android 指令脱壳,安卓脱壳之战-腾讯脱壳
  11. matlab tic and toc,[转载]matlab中tic和toc(转)
  12. 软件项目确立的几个步骤
  13. 百度与谷歌地图瓦片组织方式对比
  14. 各软件版本、仓库、官网地址
  15. clamav --reload 加载病毒库源码分析
  16. Apple Music(应用内打开Apple Music)
  17. mysql怎么查询不是张姓的_mysql 中的常用查询
  18. Mysql关于主键自增后的插入语句编写
  19. 基于树状图的族谱程序
  20. 加班合并代码,错失值 77 万元的年会大奖

热门文章

  1. squid完全攻略(一)squid优化后详细安装步骤
  2. 给TreeView控件绑定数据
  3. hiveserver或者hive启动出现Expected authority at index 7问题解决
  4. 是否使用wraps的區別
  5. NLTK找出最频繁的名词标记的程序(代码详细解释)
  6. 大话数据结构:拓扑排序
  7. keras版本 str object has no attribute decode
  8. OpenCV学习笔记五-图像混合
  9. 深度学习(五)——DRN, Bi-directional RNN, Attention, seq2seq, DMN
  10. iOS Block 知识点拾遗