二叉搜索树
来源:互联网 发布:阿里云 新网 编辑:程序博客网 时间:2024/06/07 12:13
#include <iostream>using namespace std;class Node{public: int key; Node* llink; Node* rlink;public: explicit Node(int a){key = a; llink = rlink = nullptr;}};class SerchTree{public: Node *root;public: SerchTree(); SerchTree(int *, int n); //searchTree的构建,通过读取int数组,然后向树中依次插入 //完成构建 Node * serch( int); void insert(int); void mergeDelete(int a); void copyDelete(int a ); void display(Node*);};SerchTree::SerchTree() { root = nullptr;}Node* SerchTree::serch( int key){ Node* p = root; while(p) { if(p->key > key) p = p ->llink; else if(p->key < key) p = p ->rlink; else return p; } return nullptr;}void SerchTree::insert(int a){ Node* p = root; Node* prep = nullptr; while(p) { if(p->key > a) {prep = p; p = p->llink;} else {prep = p ; p = p ->rlink;} } if(!root) //这一步是构建树的时候需要的, // 在空树的情况下需要自己构建根结点 root = new Node(a); else if(prep && prep->key > a) prep->llink = new Node(a); else if(prep && prep->key < a) prep->rlink = new Node(a);}SerchTree::SerchTree(int * a ,int n){ root = nullptr; //根节点初始化 for(int i = 0; i < n; i++) { insert(a[i]); }}//合并删除//找到被删节点左子树的最右下角的节点,将被删节点的右子树连在此节点的右子树,删除被删节点//如果被删节点有一个孩子,子承父业void SerchTree::mergeDelete(int a){ Node* p = root; //当前节点 Node* prep = nullptr;//当前节点的父节点 while(p) { //找到被删节点以及它的父节点 if(p->key > a) {prep = p; p = p->llink;} else if(p->key <a) {prep = p; p = p->rlink;} else break; } if(!p) return; //子承父业删除 if(!p->rlink) { if(p->key > prep->key) prep->rlink = p->llink ; else prep->llink = p->llink; delete(p); return; } else if(!p->llink) { if(p->key > prep->key) prep->rlink = p->rlink ; else prep->llink = p->rlink; delete(p); return; } //合并删除 else { Node* temp = p->llink; while(temp->rlink) //找到被删节点左子树的最大节点 temp = temp->rlink; temp->rlink = p->rlink;//将被删节点的右子树连在被删节点左子树最大节点的右端 if (nullptr == prep) { //如果根被删,那么以根的左子树的根节点为根 root = p->llink; delete p; return; } //将被删节点的左子树插在正确位置 if(prep->key > p->key) {prep->llink = p->llink; delete p; return;} else {prep->rlink = p->llink; delete p; return;} }}//复制删除//当被删节点只有一个孩子,子承父业//当被删节点有两个孩子,从左子树找到最大节点或者从右子树找到最小节点,将节点key复制给被删节点,然后删除最大(最小)节点void SerchTree::copyDelete(int a){ Node* p = root; Node* prep = nullptr; while(p) { if(p->key > a) {prep = p; p = p->llink; } else if(p->key < a) {prep = p; p = p->rlink; } else break; } if(!p) return; if(!p->rlink) { if(p->key > prep->key) prep->rlink = p->llink ; else prep->llink = p->llink; delete(p); } else if(!p->llink) { if(p->key > prep->key) prep->rlink = p->rlink ; else prep->llink = p->rlink; delete(p); } //以上和mergeDelete操作一样 //下面是复制删除的代码 else { Node* temp = p->llink; Node* preptemp = p; while(temp->rlink) {preptemp = temp; temp = temp->rlink;} p->key = temp->key; preptemp->rlink = temp->llink; preptemp= nullptr; delete(temp); } return;}//通过中序遍历来输出这个SEARCHTREEvoid SerchTree::display(Node* root){ if(root) { display(root->llink); cout<<root->key<<" "; display(root->rlink); }}int main(){ int a[10] = {2,56,123,65,9,8,7,1,4,513}; SerchTree atree(a , 10); atree.display(atree.root); printf("\n"); atree.insert(5); atree.display(atree.root); printf("\n"); atree.mergeDelete(2); atree.display(atree.root); printf("\n"); atree.copyDelete(513); atree.display(atree.root); printf("\n"); return 0;}
阅读全文
0 0
- 【二叉搜索数】HDU3791二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 【搜索树】二叉搜索树
- 二叉搜索树BSTree
- 二叉搜索树
- 二叉搜索树
- 二叉搜索树
- 最优二叉搜索树
- 二叉搜索树
- 二叉搜索树
- HDOJ3791 二叉搜索树
- 二叉查找树搜索
- 二叉搜索树
- 二叉搜索树
- BST 二叉搜索树
- 二叉搜索树
- codeblocks+OpenCV+cmake+MinGW环境搭建
- C++类的自动转换和强制类型转换
- 基础正则表达式
- IntelliJ IDEA搭建SpringBoot的小Demo
- 洛谷【P2758】-编辑距离
- 二叉搜索树
- 最小二乘法拟合直线c++代码
- QT on Android配置应用信息
- Java面向对象编程——多态性的实现
- 萌新理解-Java之TCP通信
- 从 Quora 的 187 个问题中学习机器学习和NLP
- 多重背包有个疑惑点
- SSL P2278 Oliver的救援 题目
- 我才接触到的深度学习的一系列不那么相关的概念weight decay ,crop等等概念