二叉查找树-优化版,使用了指针引用
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
二叉查找树-优化版,使用了指针引用相关推荐
- C语言 --- 动态内存管理(上)+优化版通讯录+笔试题
文章目录 前言 一.为什么存在动态内存分配 二.动态内存函数的介绍 2.1.malloc函数+free函数 2.2.calloc函数+free函数 2.3.realloc函数 三.常见的动态内存错误 ...
- 双重关系感知注意力机制 Dual Relation-Aware Attention[keras实现 dual attention优化版]
文章目录 前言 一.Compat Position Attention Module紧凑型位置注意力模块 二.Compat Channel Attention Module紧凑型通道注意力模块 三.效 ...
- 转 FTP搜索引擎的设计与实现(优化版)
width="336" height="280" src="http://www.zealware.com/csdnblog336280.html&q ...
- 通过指针引用数组(包含多种例子,清晰易懂)
大纲浏览 ①数组元素的指针②在引用数组元素时指针的运算③通过指针引用数组元素④用数组名作函数参数⑤通过指针引用多维数组 ①数组元素的指针 一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地 ...
- C++基础知识 - 指针引用
指针引用 指针变量的定义 int x = 666; int *p = &x;int* &q = p; //定义指针变量的引用 int* &q = p; 这叫做指针的引用. 不要 ...
- 韩顺平老师坦克大战优化版
一.项目介绍 1.前言 基于韩顺平老师坦克大战的框架和思路,进行了一些优化.编码上尽量按照阿里的代码规约:有非常详尽的注释:引入了线程池,线程安全集合类,原子类等:通过这个小项目的学习,可以深入地理解 ...
- YOLO3升级优化版!Poly-YOLO:支持实例分割!
YOLO3升级优化版!Poly-YOLO:支持实例分割! POLY-YOLO: HIGHER SPEED, MORE PRECISE DETECTION AND INSTANCE SEGMENTATI ...
- 2020-09-25C++学习笔记引用2:二级指针形参与指针形参的使用方法和区别重难点,主看综合代码(1、指针形参2、引用形参3、二级指针形参4、指针引用形参)
2020-09-25C++学习笔记引用2:二级指针形参与指针引用搭配做形参的使用方法区别重难点,注意事项主看综合代码(1.指针形参2.引用形参3.二级指针形参4.指针引用形参) 1.指针引用 #inc ...
- 智能&大数据时代,架构师思维的十个学习步骤(优化版)
前言: 秦朝的<书同文.车同轨>,加上唐朝的<诗同形>,有效的减法设计,创造了大一统(加法)的辉煌国度.君不见,在前面各步骤里,诸如:从复杂中设计出简单.以需求检验设计等都是基 ...
最新文章
- set python_python基础:集合-set()
- 图像 理想低通滤波_图像处理之滤波(下)
- 95-280-048-源码-资源管理-CPU
- 19.浏览器Window服务($window)
- Vscode ssh远程连接失败解决办法
- 京东大图在服务器哪个文件夹,京东图片管理在哪里?怎么使用?
- 基于Openfire Smack开发即时通讯应用、搭建Openfire服务器(一)
- 超级淘为什么能在众多新零售导购平台崛起,并深受大家欢迎
- MS SQL基本语法及实例操作
- No exports main defined
- 如何申请建立邮箱?收费邮箱申请流程有哪些
- 2011年网页设计发展趋势
- 【STM32F407】第8章 ThreadX NetXDUO之TCP服务器
- 每日java笔试五小题-2020-9-19
- Android SDK HTTP Proxy Server
- 【2022/01/27】thinkphp源码无差别阅读(三十)
- 产品分析必看!抖音App产品及竞品分析(快手)报告(最完善的商业分析、资料截止2019年5月)
- linux 下tomcat配置多域名访问怎么访问到的是一个站点,linux 配置多个子域名映射到tomcat中不同项目...
- 如何区分US、PAW、LDA、GGA、PW91
- excel word 网页自动求和
热门文章
- 修改 mybatis-generator 中数据库类型和 Java 类型的映射关系
- Could not execute SQL statement.
- flink网页端提交pr-修改文档报错
- kaggle中自己的notebook不见了
- 决策树-熵计算-ID3算法(转)
- 主体ubuntu16.04,宿体virtualbox下的windows7的共享文件夹设置
- matlab里sconv原理_第6章 信号的时域分析及Matlab实现.ppt
- 如何配置Filter过滤器处理JSP中文乱码
- 云计算作为当前趋势 能带给你哪些好处?
- OpenFileDialog对话框Filter属性