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. set python_python基础:集合-set()
  2. 图像 理想低通滤波_图像处理之滤波(下)
  3. 95-280-048-源码-资源管理-CPU
  4. 19.浏览器Window服务($window)
  5. Vscode ssh远程连接失败解决办法
  6. 京东大图在服务器哪个文件夹,京东图片管理在哪里?怎么使用?
  7. 基于Openfire Smack开发即时通讯应用、搭建Openfire服务器(一)
  8. 超级淘为什么能在众多新零售导购平台崛起,并深受大家欢迎
  9. MS SQL基本语法及实例操作
  10. No exports main defined
  11. 如何申请建立邮箱?收费邮箱申请流程有哪些
  12. 2011年网页设计发展趋势
  13. 【STM32F407】第8章 ThreadX NetXDUO之TCP服务器
  14. 每日java笔试五小题-2020-9-19
  15. Android SDK HTTP Proxy Server
  16. 【2022/01/27】thinkphp源码无差别阅读(三十)
  17. 产品分析必看!抖音App产品及竞品分析(快手)报告(最完善的商业分析、资料截止2019年5月)
  18. linux 下tomcat配置多域名访问怎么访问到的是一个站点,linux 配置多个子域名映射到tomcat中不同项目...
  19. 如何区分US、PAW、LDA、GGA、PW91
  20. excel word 网页自动求和

热门文章

  1. 修改 mybatis-generator 中数据库类型和 Java 类型的映射关系
  2. Could not execute SQL statement.
  3. flink网页端提交pr-修改文档报错
  4. kaggle中自己的notebook不见了
  5. 决策树-熵计算-ID3算法(转)
  6. 主体ubuntu16.04,宿体virtualbox下的windows7的共享文件夹设置
  7. matlab里sconv原理_第6章 信号的时域分析及Matlab实现.ppt
  8. 如何配置Filter过滤器处理JSP中文乱码
  9. 云计算作为当前趋势 能带给你哪些好处?
  10. OpenFileDialog对话框Filter属性