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

利用C++,设计程序,定义二叉链表,存储二叉排序树,声明并定义相应的函数,实现链式二叉排序树的下列操作

发布网友 发布时间:2023-07-13 22:47

我来回答

1个回答

热心网友 时间:2023-09-22 20:00

2 代码: 1 )二叉排序树: #include"BSTreeNode.h" #include"seqstack.h" #define Max(x1,x2) (x1>x2?x1:x2) //返回两个数中的最大者 #include using namespace std; template class BSTree { private: //void destory(BSTreeNode *p);//删除以p为根的二叉树 void InOrder(BSTreeNode *r);//私有函数:此算法按照中序次序遍历二叉树 void PostOrder(BSTreeNode *r);//私有函数:此算法按照后序次序遍历二叉树 int Depth(const BSTreeNode *r); //私有函数:此算法计算二叉树的深度 int LeafSize(const BSTreeNode *r); //私有函数:此算法计算二叉树的叶子结点个数 //void CreatPreThreed(BSTreeNode *&r); BSTreeNode*Find(const Type &k,BSTreeNode*p)const; void Insert(const Type &x,BSTreeNode*&p); void Delete(const Type &k,BSTreeNode*&p); BSTreeNode*& Min(BSTreeNode*&p); BSTreeNode *root; public: BSTree():root(NULL){} BSTreeNode *Root(){return root;} int Depth(); //计算二叉树的深度 int LeafSize(); //计算二叉树的叶子结点个数 void PreOrder();//用栈先序遍历二叉树 void CreatPreThreed(){CreatPreThreed(root);} void InOrder(); void PostOrder(); BSTreeNode *Find(const Type &k)const{return Find(k,root);} //BSTreeNode*& Min(){Min(BSTreeNode*&p);}; //Type Max(); void Insret(const Type &x){Insert(x,root);} void Delete(const Type &k){Delete(k,root);} void CreatBSTree(); }; template void BSTree::InOrder(BSTreeNode *r) { if(r!=NULL) { InOrder(r->GetLeftChild()); cout<GetData()<GetRightChild()); } } template void BSTree::PostOrder(BSTreeNode*r) { if(r!=NULL) { PostOrder(r->GetLeftChild()); PostOrder(r->GetRightChild()); cout<GetData()</递归结束条件:空树叶子结点个数为 else if(t->leftChild == NULL && t->rightChild == NULL) return 1; else return LeafSize(t->leftChild)+LeafSize(t->rightChild); } template int BSTree::Depth() { return Depth(root); } template int BSTree::Depth(const BSTreeNode* t) { if(t==NULL) return 0; //递归结束条件:空树深度为 return 1+Max(Depth(t->leftChild),Depth(t->rightChild)); } template void BSTree::PreOrder() { seqstack *> s(50); if(root==NULL) cout<<"二叉树为空!"<data<GetLeftChild(); do { if(p!=NULL) { cout<GetData()<GetLeftChild(); } else if(s.empty()!=1) { p=s.pop(); p=p->GetRightChild(); } }while(s.empty()!=1||p!=NULL); } /*template void BSTree::CreatPreThreed(BSTreeNode *&r) { Type ch; cin>>ch; if(ch=='#')return; r=new BinTreeNode(ch,NULL,NULL); CreatPreThreed(r->leftChild); CreatPreThreed(r->rightChild); }*/ template void BSTree::InOrder() { InOrder(root); } template void BSTree::PostOrder() { PostOrder(root); }/* template BSTreeNode* BSTree::Find(const Type &k,BSTree*p)const { if(p==NULL) return NULL; else if(kdata) return Find(k,p->leftChild); else if(k>p->data) return Find(k,p->rightChild); else return p; }*/ template BSTreeNode *BSTree::Find(const Type &k,BSTreeNode*p)const//在p为根的二叉排序树上进行查找的迭代算法 { BSTreeNode*temp=p; if(p!=NULL) { while(temp!=NULL) { if(temp->data==k) return temp;//查找成功 if(temp->datarightChild;//查找右子树 else temp=temp->leftChild;//查找左子树 } } return temp;//查找失败 } template void BSTree::Insert(const Type &x,BSTreeNode*&p)//在p为根的二叉排序树上插入结点的递归算法 { if(p==NULL)//空二叉树 p=new BSTreeNode(x);//创建数据元素x的结点 else if(xdata) Insert(x,p->leftChild);//在左子树插入 else if(x>p->data) Insert(x,p->rightChild);//在右子树插入 else //结点x存在 { cout<<"已经存在该节点插入失败"leftChild);//若p的关键字大于k,则在p的左子树删除 else if(k>p->data) //delete(k,p->rightChild); Delete(k,p->rightChild);//若p的关键字小于k,则在p的右子树删除 else if(p->leftChild!=NULL&&p->rightChild!=NULL) { /* temp=Min(p->rightChild); p->data=temp->data; delete(p->data,temp); */ BSTreeNode *&temp1=Min(p->rightChild); p->data=temp1->data; Delete(p->data,temp1); //注意这里和你原来的比较是Delete而非delete } else { temp=p; if(p->leftChild==NULL) p=p->rightChild; else if(p->rightChild==NULL) p=p->leftChild; delete temp; } } templatevoid BSTree::CreatBSTree() { int i(0); cout<<'\n'; Type ch; while(ch!=-1) { cout<<"第">ch; if(ch!=-1) { Insert(ch,root); i++; } else break; } } //template templateBSTreeNode*& BSTree::Min(BSTreeNode *&p) { /* BSTreeNode*&q; while(p!=NULL) { q=p; p=p->GetLeftChild(); } */ while (p->leftChild!=NULL) p=p->leftChild; return p; }
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 好命的乾隆帝和他的恶趣味 桑桑经常会做出一些出乎意料的古怪行为举三个例子 月城水韵大桥在哪儿 锡澄运河是京杭大运河的一部分吗?为什么 无锡新锡澄路3标4标什么时候投标 锡澄运河是京杭大运河的一部分吗 南通可以养捷克狼犬吗 南通能养罗威纳吗 玉溪市军用床上用品店在哪里 孟泮军用品店在那里 十里河到弘善家园403号楼有多远 北京朝阳区朝阳门地铁到弘善家园303号楼 昆明有军人服务社对外开放吗 弘善家园313号楼外面的车位收费吗 龙潭区江北军人用品服务社地址 神界原罪2死亡骑士开局怎么建 昆明哪有好的军品店 从十里河弘善家园去建外SOHO13号楼怎样坐车? 柴犬吃_5_食物,可以_解_毛! 4个月的柴犬吃什么 c++中无法解析的外部符号 鬼吹灯龙岭迷窟有几集鬼吹灯龙岭迷窟讲了什么内容 有机里E-Nu是什么 佳能sx740为什么比尼康a900贵好多 日本人叫名字的后两个字显得亲切吗 日本人的姓名中叫姓亲切还是叫名亲切? 坐月子家务分工很重要,我家是这么分工的 为什么日本人叫名字是亲切的 周末到了,有很多家务活要做,请至少写五句话介绍一下你家庭成员的劳动分工情况吧 雪居之地影大师思路分享雪居之地影大师怎么玩 戒烟药对戒烟有帮助吗? 戒烟药的戒烟效果怎么样? 万彩影像大师视频特效如何添加 家人们有哪些好的戒烟方法? 世界著名电影大师有哪些? 吃了畅便碱梅大概过了四五小时后就会有点腹痛,腹痛过后就拉肚子了,是正常现象吗? 万彩手影大师激活码2021最新 仙5前传隐藏结局? 仙剑奇侠传五前传的剑仙排名是怎样? 《穷尽一生》最新txt全集下载