二叉排序树的C++实现(过程式)
用C的思想来写的二叉排序树。在QtCreate+win7上编译通过
头文件
1 #ifndef BSTree_H 2 #define BSTree_H 3 //BSTree.h 4 #define SUC 1 5 #define UNSUC 0 6 7 #include <stdlib.h> 8 #include <cstdio> 9 typedef int KeyType; 10 //还有另一种结构,带指向父节点的指针,编写方法时更简单,但存储耗费更大 11 struct BSTNode{ 12 struct BSTNode* Lchild; 13 struct BSTNode* Rchild; 14 KeyType m_KType; 15 16 }; 17 18 typedef struct BSTNode * BSTree; 19 typedef struct BSTNode * BSTNodePoint; 20 //插入,删除节点,删除树,遍历,查找 21 bool InsertNodeByValue(BSTree&, KeyType); 22 bool DeleteNodeByValue(BSTree&,KeyType); 23 bool DeleteTree(BSTree&); 24 const void TrivalAllTree(BSTree); 25 const BSTNodePoint ResearchNodeByValue(BSTree,KeyType); 26 27 #endif
源文件
1 //BSTree.cpp 2 #include "BSTree.h" 3 #include <iostream> 4 5 using namespace std; 6 7 bool InsertNodeByValue(BSTree &tree, KeyType value) 8 { 9 //使用的临时变量 10 BSTNodePoint p = tree , parent = NULL; 11 //创建一个新节点及初始化 12 BSTNodePoint newNode = (BSTNodePoint)malloc(sizeof(BSTNode)); 13 newNode->m_KType = value; 14 newNode->Lchild = NULL; 15 newNode->Rchild = NULL; 16 //空树则节点为其跟 17 if( NULL == tree ) 18 { 19 tree = newNode; 20 return SUC; 21 22 } 23 //新插入的结点一定是一个新添加的叶子节点, 24 //并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。 25 while( NULL != p) 26 { 27 if( value == p->m_KType) 28 { 29 return UNSUC; 30 } 31 else 32 { 33 parent = p; 34 p = ( p->m_KType < value )? p->Rchild : p->Lchild ; 35 } 36 } 37 //parent是插入节点的父节点,以下判断插入其左或右孩子 38 if( value > parent->m_KType ) 39 { 40 parent->Rchild = newNode; 41 } 42 else 43 { 44 parent->Lchild = newNode; 45 } 46 return SUC; 47 48 49 } 50 //后序删除树,原因:由于指针会置空,后序才能不影响释放 51 bool DeleteTree(BSTree& tree) 52 { 53 54 if( NULL != tree) 55 { 56 57 DeleteTree(tree->Lchild); 58 DeleteTree(tree->Rchild); 59 cout<<"Delete key value is "<<tree->m_KType<<endl; 60 61 free(tree); 62 //置空,以防错误调用野指针 63 tree = NULL; 64 65 } 66 return SUC; 67 } 68 //中序遍历,输入有序序列 69 const void TrivalAllTree( BSTree tree) 70 { 71 if( NULL != tree ) 72 { 73 cout<<"dd"; 74 TrivalAllTree(tree->Lchild); 75 cout<<tree->m_KType<<endl; 76 TrivalAllTree(tree->Rchild); 77 } 78 79 80 } 81 const BSTNodePoint ResearchNodeByValue(BSTree tree,KeyType value) 82 { 83 if( NULL != tree) 84 { 85 if( tree->m_KType == value) 86 { 87 return tree; 88 } 89 return ResearchNodeByValue( tree->Lchild, value); 90 return ResearchNodeByValue( tree->Rchild, value); 91 92 } 93 return NULL; 94 } 95 bool DeleteNodeByValue(BSTree &tree, KeyType value) 96 { 97 98 99 BSTNodePoint parent = NULL,p = tree,q = NULL,child = NULL; 100 101 //循环结果:p指向了要删除的节点,parent被删除的节点的父节点 102 //这里也可以使用递归实现 103 while( NULL != p ) 104 { 105 if( p->m_KType == value ) 106 { 107 break; 108 } 109 else 110 { 111 parent = p; 112 p = ( p->m_KType < value ) ? p->Rchild : p->Lchild ; 113 } 114 115 116 } 117 if( NULL == p) 118 {return UNSUC;} 119 120 //q用于后面判断 121 q = p; 122 //rchild & lchild exist*/ 123 //转换成单个孩子的情况*/ 124 if( NULL != p->Lchild && NULL != p->Rchild) 125 { 126 parent = p; 127 p = p->Rchild; 128 //p指向要删除节点的右子树的最左节点,parent是p的父节点,使删除操作巧妙的转移 129 while( NULL != p->Lchild) 130 { 131 parent = p; 132 p = p->Lchild ; 133 } 134 child = p->Rchild; 135 136 137 } 138 else if( NULL != p->Lchild ) 139 { 140 child = p->Lchild; 141 } 142 else if( NULL != p->Rchild ) 143 { 144 child = p->Rchild; 145 } 146 else 147 { 148 child = NULL; 149 } 150 151 //parent被删除的节点的父节点 152 //p被删除的节点 153 //child被删除节点的孩子 154 // 155 156 //parent指向child*/ 157 if( NULL == parent) 158 { 159 tree = child; 160 } 161 else 162 { 163 if( p == parent->Lchild ) 164 { 165 parent->Lchild = child; 166 } 167 else 168 { 169 parent->Rchild = child; 170 } 171 //发生了转换操作后,实质等同于交换节点 172 if( q != p ) 173 { 174 q->m_KType = p->m_KType; 175 } 176 } 177 178 //删除 179 free(p); 180 p = NULL; 181 return SUC; 182 183 184 }
测试函数
1 //BSTree-test-main 2 3 4 5 #include <iostream> 6 #include "BSTree.h" 7 using namespace std; 8 9 int main() 10 { 11 cout << "Hello World!" << endl; 12 13 BSTree tree = NULL; 14 bool staus = InsertNodeByValue(tree, 3); 15 InsertNodeByValue(tree, 2); 16 //cout<<tree->m_KType<<endl; 17 InsertNodeByValue(tree, 15); 18 InsertNodeByValue(tree, 8); 19 InsertNodeByValue(tree, 17); 20 //TrivalAllTree(tree); 21 TrivalAllTree(tree); 22 bool staus2 = DeleteNodeByValue(tree,15); 23 cout<<"staus2 : "<<staus2<<endl; 24 TrivalAllTree(tree); 25 DeleteTree(tree); 26 TrivalAllTree(tree); 27 return 0; 28 }
转载于:https://www.cnblogs.com/Dean-winston/archive/2013/03/15/2961537.html
二叉排序树的C++实现(过程式)相关推荐
- 【spring】编程式事务控制
结构: AccountServiceImpl package com.itheima.service.impl;import com.itheima.dao.IAccountDao; import c ...
- 数据结构(8-3)二叉排序树(查找、插入删除)
目录 一.基础理论 1.特点: 2.结构: 二.查找 三.插入 四.删除 1.被删除的结点D是叶子结点 2.被删除的结点D仅有一个孩子 2-1.删除结点14(有左无右) 2-2.删除结点 10 (有右 ...
- 二叉排序树的相关操作
#include <IOSTREAM.H> #include <STDLIB.H> //二叉树的生成和释放 typedef struct Node {int data;stru ...
- 用delphi创建服务程式
视窗系统 2000/XP和2003等支持一种叫做"服务程式"的东西.程式作为服务启动有以下几个好处: (1)不用登陆进系统即可运行. (2)具有SYSTEM特权.所以你在进程管理器 ...
- 如何強迫 .Net 應用程式輸出英文的例外訊息
转自:http://feeds.feedburner.com/~r/TheWillWillWeb/~3/358986630/post.aspx 因為常常需要跟國外 Blogger 交流,甚至回報某些國 ...
- Python 过程式编程与函数式编程
过程式与函数式是两种截然不同的编程方式和思考方法,下面以求解素数为例做一下对比. 采用过程式编程 def isPrime(n):mid = int(pow(n,0.5)+1)for i in xran ...
- 树和二叉树(四种遍历,建树)详解+二叉排序树(包含图像和相关习题)
目录 树和二叉树 一.树 2.有序树和无序树 3.森林 4.树的基本性质 二.二叉树的概念 (1)二叉树的编号 1.二叉树和度为2的有序树的区别: 2.满二叉树 3.完全二叉树: 4.平衡二叉树: 5 ...
- 二叉排序树(完整代码)
目录 二叉排序树 1.二叉排序树(代码) P1087 FBI树 (建树) HDU 4707 Pet 二叉排序树 先序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左 ...
- 二分查找与二叉排序树
文章目录 二分查找与二叉排序树 二分查找 1. 二分查找 2. 区间查找 3. 基于旋转数组的二分查找 二叉查找(排序)树 1. 插入节点 2. 查找节点 二分查找与二叉排序树 二分查找 1. 二分查 ...
最新文章
- 干货丨大规模机器学习框架的四重境界(经典长文,值得收藏)
- 中科院院士张钹:发展第三代AI技术,中美处在同一起跑线上
- DVWA--Brute Force(暴力破解)--四个等级
- e记法 python 底数_备战python二级
- Docker exec 命令执行出错, 显示 the input device is not aTTY 的解决办法
- CTO:再写if-else,逮着罚款1000!
- c++中初始化列表顺序和声明顺序一致
- zk 02之 Windows安装和使用zookeeper
- ★大脑的9大未解之谜
- selenium实现失败重运行
- android 单独编译contacts,Android编译全过程
- Javascript的冒泡排序和二分查找
- 《乐高EV3机器人搭建与编程》——2.1 零件储存箱
- 弱监督学习-snorkel
- 自强不息系列之Python 选择排序
- 您还差宝贝一张语文教学光盘!教你如何制作ISO文件
- Granger Causality 格兰杰因果关系
- 集团企业邮箱申请哪家的好,怎么选择?
- LeetCode/LintCode 题解丨一周爆刷双指针:数组中的最长山脉
- 概率机器人(Probability Robotics)笔记 Chapter 9: 占据栅格建图(Occupancy Grid Mapping)
热门文章
- 接口测试学习——jmeter分布式压测
- [Codeforces]Codeforces Round #460 (Div. 2)
- 5.RabbitMQ 客户端控制消息
- bzoj4237稻草人
- How to install sharepoint server 2010 sp2 in window 7 x64
- springmvc和servlet在上传和下载文件(保持文件夹和存储数据库Blob两种方式)
- 使用Opencv进行轮廓检测,字符提取,简单的直方图字符识别!
- java 第十一章总结
- 2009年4月计算机网络原理,全国2009年4月高等教育自学考试计算机网络原理
- Android虚拟机和Java虚拟机的区别