二叉查找树-优化版,使用了指针引用
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 ...
- 智能&大数据时代,架构师思维的十个学习步骤(优化版)
前言: 秦朝的<书同文.车同轨>,加上唐朝的<诗同形>,有效的减法设计,创造了大一统(加法)的辉煌国度.君不见,在前面各步骤里,诸如:从复杂中设计出简单.以需求检验设计等都是基 ...
最新文章
- 微软系统工具套件SysinternalsSuite各个工具功能说明
- linux查看机器品牌信息,dmidecode查看linux硬件信息
- C++ class实现顺序队列(完整代码)
- 搜索引擎蜘蛛给网站带来的危害,有效指引爬虫对应的措施(最准确搜索引擎蜘蛛名称)...
- Linux内核跟踪eBPF:bpftrace 参考指南
- UVa 10020 (最小区间覆盖) Minimal coverage
- NYOJ-111分数加减法
- 工具说明书 - 网页内容抓取工具Web Scraper(一)
- 批处理之 FOR循环
- android 指令脱壳,安卓脱壳之战-腾讯脱壳
- matlab tic and toc,[转载]matlab中tic和toc(转)
- 软件项目确立的几个步骤
- 百度与谷歌地图瓦片组织方式对比
- 各软件版本、仓库、官网地址
- clamav --reload 加载病毒库源码分析
- Apple Music(应用内打开Apple Music)
- mysql怎么查询不是张姓的_mysql 中的常用查询
- Mysql关于主键自增后的插入语句编写
- 基于树状图的族谱程序
- 加班合并代码,错失值 77 万元的年会大奖
热门文章
- squid完全攻略(一)squid优化后详细安装步骤
- 给TreeView控件绑定数据
- hiveserver或者hive启动出现Expected authority at index 7问题解决
- 是否使用wraps的區別
- NLTK找出最频繁的名词标记的程序(代码详细解释)
- 大话数据结构:拓扑排序
- keras版本 str object has no attribute decode
- OpenCV学习笔记五-图像混合
- 深度学习(五)——DRN, Bi-directional RNN, Attention, seq2seq, DMN
- iOS Block 知识点拾遗