问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

二叉查找树算法

发布网友 发布时间:2022-04-30 03:24

我来回答

1个回答

热心网友 时间:2023-10-09 14:24

#include <iostream>using namespace std;typedef struct _node{int data;struct _node *pLeftPtr;struct _node *pRightPtr;}BTreeNode;class BinarySearchTree{public:BinarySearchTree();~BinarySearchTree();bool Create(int* pIntArray,int arrLength);bool Insert(int data);// 查找节点,searchLength为搜索长度,返回值为true表示指定的数据存在,否则不存在bool Find(int data, int* searchLength);// 中序输出二叉树void MidOutput();// 释放内存void Destroy();void Delete(int data);protected:bool Insert(BTreeNode* pRoot, int data);bool Find(BTreeNode* pRoot,int data, int *searchLength);void Delete(BTreeNode* &pRoot, int data);void MidOutput(BTreeNode* pRoot);void Destroy(BTreeNode* pRoot);private:BTreeNode* m_pRoot; //二叉搜索树根节点};BinarySearchTree::BinarySearchTree(){m_pRoot = NULL;}BinarySearchTree::~BinarySearchTree(){Destroy();}bool BinarySearchTree::Create(int* pIntArray,int arrLength){for(int i=0; i<arrLength; i++){if(!Insert(*(pIntArray+i)))return false;}return true;}bool BinarySearchTree::Insert(BTreeNode* pRoot, int data){BTreeNode* pNewNode = new BTreeNode;if(pNewNode == NULL)return false;pNewNode->data = data;pNewNode->pLeftPtr = NULL;pNewNode->pRightPtr = NULL;BTreeNode* pCurrentNode = pRoot;BTreeNode* pParentNode = pCurrentNode;// 保存父节点的指针int flag = 0;// 标记插入节点的位置if(pCurrentNode == NULL){m_pRoot = pNewNode;}else{while(pCurrentNode){if(data < pCurrentNode->data){pParentNode = pCurrentNode;pCurrentNode = pCurrentNode->pLeftPtr;flag = 0;}else if(data > pCurrentNode->data){pParentNode = pCurrentNode;pCurrentNode = pCurrentNode->pRightPtr;flag = 1;}}if(flag == 0){pParentNode->pLeftPtr = pNewNode;}else{pParentNode->pRightPtr = pNewNode;}}return true;}bool BinarySearchTree::Insert(int data){return Insert(m_pRoot,data);}bool BinarySearchTree::Find(BTreeNode* pRoot,int data, int *searchLength){if(pRoot == NULL){*searchLength = 0;return false;}BTreeNode* pCurrentNode = pRoot;static int length = 0; while(pCurrentNode != NULL){if(data == pCurrentNode->data){*searchLength = length;cout<<"数字"<<data<<"存在二叉树中,查找长度为: "<<endl<<length<<endl;return true;}else if(data < pCurrentNode->data){length ++;pCurrentNode = pCurrentNode->pLeftPtr;}else{length ++;pCurrentNode = pCurrentNode->pRightPtr;}}*searchLength = length;cout<<"数字"<<data<<"不在二叉树中,查找长度为: "<<endl<<length<<endl;length = 0; // 每次查找结束,重新赋值为0return false;}bool BinarySearchTree::Find(int data, int* searchLength){return Find(m_pRoot,data,searchLength);}void BinarySearchTree::Destroy(BTreeNode* pRoot){BTreeNode* pCurrentNode = pRoot;if(pCurrentNode == NULL)return;Destroy(pCurrentNode->pLeftPtr);Destroy(pCurrentNode->pRightPtr);delete pCurrentNode;m_pRoot = NULL;}void BinarySearchTree::Destroy(){Destroy(m_pRoot);}void BinarySearchTree::MidOutput(BTreeNode* pRoot){if(pRoot){MidOutput(pRoot->pLeftPtr);cout<<pRoot->data <<" ";MidOutput(pRoot->pRightPtr);}}void BinarySearchTree::MidOutput(){MidOutput(m_pRoot);}void BinarySearchTree::Delete(int data){Delete(m_pRoot,data);}void BinarySearchTree::Delete(BTreeNode* &pRoot, int data){if(!pRoot)return;else if(data == pRoot->data){if(pRoot->pLeftPtr == NULL && pRoot->pRightPtr == NULL) // 叶子节点{delete pRoot;pRoot = NULL;}else if(pRoot->pLeftPtr != NULL && pRoot->pRightPtr == NULL){ // 只有左子树 BTreeNode* pNode = pRoot->pLeftPtr;delete pRoot;pRoot = pNode;}else if(pRoot->pLeftPtr == NULL && pRoot->pRightPtr != NULL){ // 只有右子树BTreeNode* pNode = pRoot->pRightPtr;delete pRoot;pRoot = pNode;}else{ // 有左右子树// 找到左子树的最大节点BTreeNode* pCurrentNode = pRoot->pLeftPtr;BTreeNode* pParentNode = NULL;while(pCurrentNode->pRightPtr != NULL){pParentNode = pCurrentNode;pCurrentNode = pCurrentNode->pRightPtr;}pRoot->data = pCurrentNode->data;if(pParentNode){pParentNode->pRightPtr = pCurrentNode->pLeftPtr;}else{pRoot->pLeftPtr= pCurrentNode->pLeftPtr;}delete pCurrentNode;}}else if(data < pRoot->data)Delete(pRoot->pLeftPtr, data);elseDelete(pRoot->pRightPtr, data);}void main(){int data[8]; cout<<"请输入整形数据, 数据用空格隔开, 回车键结束输入"<<endl; for(int i=0; i<8; i++) cin>>data[i];// int data[8] = {13,15,6,20,14,5,7,18};BinarySearchTree tree;tree.Create(data,sizeof(data)/sizeof(data[0]));cout<<"插入数据后的二叉树为: "<<endl;tree.MidOutput();cout<<endl;int len_1=0;int len_2=0;tree.Find(14,&len_1);tree.Find(21,&len_2);tree.Delete(20);cout<<"删除数字20后的二叉树结果: "<<endl;tree.MidOutput();cout<<endl;tree.Delete(15);cout<<"删除数字15后的二叉树结果: "<<endl;tree.MidOutput();cout<<endl;}追问怎么那么多,我怎么一点都看不懂,还有我们正在做上机实验,拜托能不能弄简单一点,拜托了,大恩不言谢

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 实验四 二叉排序树查找 二叉树排序算法实现(数据结构课程设计) 请编写一个判别给定二叉树是否为二叉排序树的算法 土豆如何使用冷库保鲜 奔腾X40分体式导航 改家用,不知道怎么接线 求大神指教。显示屏的电源是直接12V的吗? 奔腾x40怎样连接DLife 奔腾x40的方向盘车标怎么取下来 什么样的头像比较好看 奔腾x40怎么用手机连接车载导航 奔腾x40导航可以装导航模块吗 奔腾汽车安装导航怎么改装中控台 奔腾x40导航怎么激活 一个女孩的朋友圈封面是千与千寻的动漫壁纸,当我发了一条关于千与千寻的经典台词到朋友圈后 奔腾x40怎么投屏导航 奔腾x40还完车款用到4s店拆除GPS吗? 奔腾x40尊享型原车导航怎么用 奔腾x40怎么下载高德地图 中国有名的室内设计师? 兴旺小爱同学在智能家居方面有什么特色? 华为no va 6se 跟vivos 5那款好? 二叉排序树的实现(C++) 用顺序和二叉链表作存储结构 我是1989年农历八月初九出生的请问我属于什么星座呢? 1988年农历八月初九的生日是什么星座 1986年农历八月初九是什么星座? 1985 年农历8月初九属于什么星座 今年农历八月初九出生的人属于什么星座? 我的生日是八月初九,我是什么星座 麦芽小达人充电灯不亮 小达人点读笔充电时红灯绿灯一起亮后闪退 小达人点读笔充满电放一晚上就没有电怎么办? 小达人点读笔可以用别的插座充电吗? 小达人点读笔充电充满了能自动断电吗? 为什么男孩那么喜欢抓女孩的胸部,然后…还有下面?? 为什么我和女友接吻时,我摸了她的胸,但她拽我手好几次,我没有放开 被男友摸胸,亲亲,最后他还隔着衣服蹭了几下 - 信息提示 苏泊尔电磁炉记忆启停怎么关闭? 电磁炉的童锁功能怎么用,谢谢 莎士比亚 简介100字以内 莎士比亚的故事