博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉搜索树
阅读量:6311 次
发布时间:2019-06-22

本文共 3321 字,大约阅读时间需要 11 分钟。

#include
#include
#include
#include
using namespace std;struct TreeNode{ TreeNode* p; TreeNode* l; TreeNode* r; int key; TreeNode() { p = 0; l = 0; r = 0; key = -1; }};const int RANDMOD = 300;const int MAX = 10;TreeNode* root = new TreeNode;int tIndex = 0;int a[MAX];int getRandom(){ return rand() % RANDMOD;}/** * 中序遍历 */void inOrder(TreeNode* root){ if(root == NULL) return; inOrder(root->l); cout << root->key << " "; inOrder(root->r);}/** * 插入一个结点,等于在左子树 */void insertNode(int key){ if(root->key == -1) { root->key = key; return; } TreeNode* p = root; TreeNode* pc = 0; while (p != NULL) { pc = p; if(key <= p->key) p = p->l; else p = p->r; } TreeNode* newNode = new TreeNode; newNode->key = key; newNode->p = pc; if(key <= pc->key) pc->l = newNode; else pc->r = newNode;}/** * 查找root->key=key的结点 */TreeNode* findNode(TreeNode* root, int key){ if(root->key == key) return root; if(key <= root->key) return findNode(root->l, key); else return findNode(root->r, key); return 0;}/** * 查找以该结点为根的最小key的结点 */TreeNode* minNode(TreeNode* node){ while (node->l != NULL) node = node->l; return node;}/** * 查找以该结点为根的最大key的结点 */TreeNode* maxNode(TreeNode* node){ while (node->r != NULL) node = node->r; return node;}/** * z结点的后继结点 y * y.key > z.key && y2.key>y.key */TreeNode* afterNode(TreeNode* zNode){ if(zNode->r != NULL) return minNode(zNode->r); TreeNode* y = zNode->p; while (y != NULL && zNode == y->r) { zNode = y; y = y->p; } //不存在返回NULL return y;}/** *用v为根的结点替换u为根的子树 */void transplant(TreeNode* u, TreeNode* v){ //树根 if(u->p == NULL) root = v; else if(u == u->p->l) { u->p->l = v; } else u->p->r = v; if(v != NULL) v->p = u->p;}void deleteNode(TreeNode* zNode){ if(zNode->l == NULL) transplant(zNode, zNode->r); else if(zNode->r == NULL) transplant(zNode, zNode->l); else { TreeNode* y = minNode(zNode->r); if(y->p != zNode) { transplant(y, y->r); y->r = zNode->r; y->r->p = y; } transplant(zNode, y); y->l = zNode->l; y->l->p = y; }}int main(){ /** * 二叉搜索树,左子树的所有结点小于等于根结点,右子树的所有结点大于根节点 */ for(int i = 0; i < MAX; i++) { int k = getRandom(); a[i] = k; insertNode(k); } for(int i = 0; i < MAX; i++) cout << a[i] << " "; cout << endl; inOrder(root); cout << endl; cout << "最大值" << maxNode(root)->key << endl; cout << "最小值" << minNode(root)->key << endl; TreeNode* zNode = findNode(root, a[tIndex]); TreeNode* aNode = afterNode(zNode); if(aNode != NULL) cout << a[tIndex] << "的后继结点" << aNode->key << endl; else cout << a[tIndex] << "没有后继结点" << endl; //TODO删除一个结点 cout << "删除结点" << a[tIndex] << endl; deleteNode(zNode); inOrder(root); return 0;}

 

posted on
2017-06-02 22:26 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/shuiyonglewodezzzzz/p/6935406.html

你可能感兴趣的文章
http2-head compression
查看>>
C# 命名空间
查看>>
订餐系统之同步美团商家订单
查看>>
使用ArrayList时设置初始容量的重要性
查看>>
Java Web-----JSP与Servlet(一)
查看>>
Maven搭建SpringMVC+Mybatis项目详解
查看>>
关于量子理论:最初无意的简化,和一些人有意的强化和放大
查看>>
CentOS 6.9通过RPM安装EPEL源(http://dl.fedoraproject.org)
查看>>
“区块链”并没有什么特别之处
查看>>
没有功能需求设计文档?对不起,拒绝开发!
查看>>
4星|《先发影响力》:影响与反影响相关的有趣的心理学研究综述
查看>>
IE8调用window.open导出EXCEL文件题目
查看>>
python之 列表常用方法
查看>>
vue-cli脚手架的搭建
查看>>
在网页中加入百度搜索框实例代码
查看>>
在Flex中动态设置icon属性
查看>>
采集音频和摄像头视频并实时H264编码及AAC编码
查看>>
3星|《三联生活周刊》2017年39期:英国皇家助产士学会于2017年5月悄悄修改了政策,不再鼓励孕妇自然分娩了...
查看>>
高级Linux工程师常用软件清单
查看>>
堆排序算法
查看>>