C++ class类 实现搜索二叉树(BST)

代码如下:

#include <iostream>
using namespace std;class BSTNode {private:double key;BSTNode *lchild;BSTNode *rchild;BSTNode *parent;friend class BSTree;public:BSTNode(double k = 0.0, BSTNode *l = nullptr, BSTNode *r = nullptr, BSTNode *p = nullptr): key(k), lchild(l), rchild(r), parent(p) {}
};class BSTree
{private:BSTNode *root;void inorder_tree_walk(BSTNode *t) {if (t != nullptr) {inorder_tree_walk(t->lchild);cout << t->key << " ";inorder_tree_walk(t->rchild);}
}void preorder_tree_walk(BSTNode *t) {if (t != nullptr) {cout << t->key << " ";preorder_tree_walk(t->lchild);preorder_tree_walk(t->rchild);}
}void postorder_tree_walk(BSTNode *t) {if(t!=nullptr){postorder_tree_walk(t->lchild);postorder_tree_walk(t->rchild);cout << t->key << " ";
}
}BSTNode *tree_search_one(BSTNode *t, double k) {if (t == nullptr || k == t->key)return t;if (k < t->key)return 	tree_search_one(t->lchild,k);elsereturn tree_search_one(t->rchild,k);
}BSTNode *tree_search_two(BSTNode *t,double k)
{while(t!=nullptr && k!=t->key){if (k < t->key)t = t->lchild;else t = t->rchild;}return t;
}BSTNode *tree_min(BSTNode *t)
{while(t->lchild!=nullptr)t = t->lchild;return t;
}BSTNode *tree_max(BSTNode *t)
{while(t->rchild!=nullptr)t = t->rchild;return t;
}BSTNode *tree_successor(BSTNode *t)
{BSTNode *y;if (t->rchild!=nullptr) return tree_min(t->rchild);y = t->parent;while(y!=nullptr && t==y->rchild){t = y;y = y->parent;}return y;
}BSTNode *tree_predecessor(BSTNode *t)
{BSTNode *y;y = t->parent;if (t->lchild!=nullptr) return tree_max(t->lchild);while(y!=nullptr && t==y->lchild){t = y;y = y->parent;}return y;
}void tree_insert(BSTNode *&t,BSTNode *z)
{BSTNode *x = t;BSTNode *y = nullptr;while(x!=nullptr){y = x;if (z->key < x->key) x = x->lchild;else x = x->rchild;}z->parent = y;if (y==nullptr) t = z;else if (z->key < y->key) y->lchild = z;else y->rchild = z;
}void transplant(BSTNode *&t,BSTNode *u,BSTNode *v)
{if (u->parent==nullptr) t = v;else if (u->parent->lchild==u) u->parent->lchild = v;else u->parent->rchild = v;if (v!=nullptr) v->parent = u->parent;
}BSTNode *tree_delete(BSTNode *&t,BSTNode *z)
{BSTNode *y = nullptr;if(z->lchild==nullptr) transplant(t,z,z->rchild);else if (z->rchild==nullptr) transplant(t,z,z->lchild);else{y = tree_min(z->rchild);if (y->parent!=z){transplant(t,y,y->rchild);y->rchild = z->rchild;y->rchild->parent = y;}transplant(t,z,y);y->lchild = z->lchild;y->lchild->parent = y;}return z;
}void tree_destory(BSTNode *&t){if(t==nullptr) return ;if (t->lchild!=nullptr) return tree_destory(t->lchild);if (t->rchild!=nullptr) return tree_destory(t->rchild);delete t;t = nullptr;}public:BSTree():root(nullptr){}void PreOrder_Tree_Walk(){preorder_tree_walk(root);cout<<endl;}void InOrder_Tree_Walk(){inorder_tree_walk(root);cout<<endl;}void PostOrder_Tree_Walk(){postorder_tree_walk(root);cout<<endl;}BSTNode *Tree_Search(double key){return tree_search_one(root,key);}BSTNode *Iterative_Tree_Search(double key){return tree_search_two(root,key);}BSTNode* Tree_Minimum(BSTNode *x){return tree_min(x);				}BSTNode* Tree_Maximum(BSTNode *x){return tree_max(x);					}BSTNode *Tree_Successor(BSTNode *x){return tree_successor(x);}BSTNode *Tree_Predecessor(BSTNode *x){return tree_predecessor(x);}void Tree_Insert(double key){BSTNode *z = new BSTNode(key,nullptr,nullptr,nullptr);if (z==nullptr) return ;tree_insert(root,z); }void Tree_Delete(double key){BSTNode *z,*node;z = tree_search_two(root,key);if (z!=nullptr){node = tree_delete(root,z);if (node !=nullptr){delete node;node = nullptr;}}}void Tree_Destory(){tree_destory(root);}~BSTree(){Tree_Destory();}
};int main()
{int i,j,n;double *arr;BSTree *tree = new BSTree();cout<<"请输入节点/关键字个数:"<<endl;cin>>n;arr = new double[n];cout<<"请依次输入关键字(注意每棵子树的根节点都要比它的孩子结点先输入): "<<endl;for (int i = 0;i<n;i++){cin>>arr[i];tree->Tree_Insert(arr[i]);}cout<<endl;cout << "二叉搜索树先序遍历的结果为: ";tree->PreOrder_Tree_Walk();cout << "二叉搜索树中序遍历的结果为: ";tree->InOrder_Tree_Walk();cout << "二叉搜索树后序遍历的结果为: ";tree->PostOrder_Tree_Walk();cout << endl;double seakey;cout<<"请输入要查找的节点关键字:"<<endl;cin>>seakey;BSTNode *seaNode  = tree->Tree_Search(seakey);if (seaNode) cout<<"查找成功!"<<endl;else 		cout << "查找失败, 关键字为" << seakey << "的结点不存在" << endl;cout<<endl;double delkey;cout << "请输入要删除的结点关键字: " << endl;cin >> delkey;tree->Tree_Delete(delkey);// 通过先序与中序遍历,或者中序与后序遍历可以唯一确定一棵二叉树// 因此此处可以验证删除后的二叉搜索树是否与你预想的一样cout << "删除操作后先序遍历二叉搜索树的结果为: ";tree->PreOrder_Tree_Walk();cout << "删除操作后中序遍历二叉搜索树的结果为: ";tree->InOrder_Tree_Walk();cout << endl;tree->Tree_Destory();				// 销毁二叉树delete[] arr;system("pause");return 0;
}

测试结果:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
参考于:
https://blog.csdn.net/qq_21396469/article/details/78419609

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Nuget多项目批量打包上传服务器的简明教程

本篇不会介绍Nuget是什么&#xff0c;如何打包上传Nuget包&#xff0c;怎么搭建私有Nuget服务器。这些问题园子里都有相应的文章分享&#xff0c;这里不做过多阐述。另外本文假设你已经下载了Nuget.exe&#xff0c;并且已经设置好了环境变量。什么&#xff1f;你还不会&#xf…

C++ struct结构体 实现搜索二叉树(BST)

代码如下: #include <iostream> using namespace std;struct BSTNode {double v 0.0;BSTNode *lc nullptr;BSTNode *rc nullptr;BSTNode *par nullptr; };void inorder_tree(BSTNode *t) {if (t ! nullptr) {inorder_tree(t->lc);cout << t->v <<…

如何用 Blazor 实现 Ant Design 组件库(二)

前言前两周&#xff0c;我发表了上一篇文章《如何用 Blazor 实现 Ant Design 组件库&#xff1f;》&#xff0c;得到了很多朋友的响应&#xff0c;也有很多朋友加入我的钉钉群&#xff0c;并收听了我在第二天的直播。这次直播是我人生第一次做直播&#xff0c;以至于没做什么准…

计算机蠕虫是一个程序或程序系列,它采取截取口令并试图在系统中,计算机蠕虫病毒是一个程序或程序系列,它采取截取口令并试图在系统中做非法动作的方式直接攻击计算机。...

采用FCA条件时&#xff0c;计算机蠕计算机卖方应负的责任是( )某资本家制衣厂内&#xff0c;虫病程序工人一个月工作30天&#xff0c;虫病程序其月工资为1500元。据工厂统计&#xff0c;每天每位工人能生产5件衣服&#xff0c;每件价值100元&#xff0c;每件衣服生产时产生的费…

.NET 5 中的正则引擎性能改进(翻译)

前言System.Text.RegularExpressions 命名空间已经在 .NET 中使用了多年&#xff0c;一直追溯到 .NET Framework 1.1。它在 .NET 实施本身的数百个位置中使用&#xff0c;并且直接被成千上万个应用程序使用。在所有这些方面&#xff0c;它也是 CPU 消耗的重要来源。但是&#x…

以个人身份加入.NET基金会

.NET 走向开源&#xff0c;MIT许可协议。微软为了推动.NET开源社区的发展&#xff0c;2014年联合社区成立了.NET基金会。一年前 .NET 基金会完成第一次全面改选&#xff0c;2014年 .NET基金会的创始成员中有六位创始人&#xff0c;均非微软公司员工&#xff0c;随着微软的收购动…

计算机连接拒绝访问,Win10系统下Windows无法连接到打印机,拒绝访问的解决办法...

我们在办公的时候&#xff0c;经常会使用打印机共享的功能&#xff0c;近期有一位Win10用户在共享打印机的时候&#xff0c;系统提示了“Windows无法连接到打印机&#xff0c;拒绝访问”的错误。原因是用户和组没有everyone&#xff0c;才会导致打印机拒绝访问的情况。那么我们…

十问十答 BSD 许可证

BSD 许可证或原始 BSD 许可证&#xff08;the original BSD License&#xff09;及其两个变体——修改的 BSD 许可证&#xff08;又称 The 3-clause BSD License&#xff09;和简化的 BSD 许可证/FreeBSD 许可证&#xff08;又称 BSD 2-Clause "Simplified" License&…

C++ class实现单向循环链表(完整代码)

注意: 写Delete_all要稍微注意一下&#xff0c;先判断tail是否为空&#xff0c;只有不为空时才能拿某个指针指向其next域 代码如下: #include <iostream> using namespace std; typedef int ElemType; #define NO 0class Node {friend class LinkList;public:Node(): …

这一次,终于弄懂了协变和逆变

一、前言刘大胖决定向他的师傅灯笼法师请教什么是协变和逆变。刘大胖&#xff1a;师傅&#xff0c;最近我在学习泛型接口的时候看到了协变和逆变&#xff0c;翻了很多资料&#xff0c;可还是不能完全弄懂。灯笼法师&#xff1a;阿胖&#xff0c;你不要被这些概念弄混&#xff0…

大一计算机专业学期计划范文,大一学习计划范文4篇

大一学习计划范文4篇时间的脚步是无声的&#xff0c;它在不经意间流逝&#xff0c;我们又将迎来新的学习任务&#xff0c;写一份学习计划&#xff0c;为接下来的学习做准备吧&#xff01;但是学习计划要写什么内容才是正确的呢&#xff1f;以下是小编精心整理的大一学习计划范文…

C++ class实现双向循环链表(完整代码)

写Delete_all的时候注意一下就好了&#xff0c;先判断空白头结点是不是为NULL 代码如下: #include <iostream> using namespace std; typedef int ElemType; #define NO 0class Node {friend class LinkList;public:Node(): next(NULL), prior(NULL) {};private:ElemTy…

5分钟看懂微服务架构下的Consul 特性及搭建

一、前言虽然说牛逼的公司都有那么几个牛逼的运维团队&#xff0c;牛逼的运维团队都有着神秘黑科技般敲代码的姿势&#xff1b;本人虽然不是一个运维工程师&#xff0c;但是自己比较爱倒腾这些东西&#xff0c;会那么一点点运维姿势&#xff0c;虽然不算专业&#xff0c;但是还…

win7 计算机定时关机脚本,win7定时关机设置及命令

电脑定时关机是一个常用的功能&#xff0c;定时关机的小软件也有不少&#xff0c;但 Win7 也为我们提供了定时关机的功能&#xff0c;额外下载软件不如就地取材。win7定时关机可通过两种方式实现&#xff0c;一种是创建计划任务&#xff0c;另一种是用win7定时关机命令 shutdow…

ASP.NET Core分布式项目实战(客户端集成IdentityServer)--学习笔记

任务9&#xff1a;客户端集成IdentityServer新建 API 项目dotnet new webapi --name ClientCredentialApi控制器添加验证using Microsoft.AspNetCore.Authorization;namespace ClientCredentialApi.Controllers {[ApiController][Route("[controller]")][Authorize]p…

C++ class实现顺序栈(完整代码)

代码如下: #include <iostream> using namespace std; typedef int ElemType;class SeqStack {public:SeqStack(int stacksize 100) {base new ElemType[stacksize];top base;size stacksize;};~SeqStack() {delete[] base;top NULL;base NULL;};int Empty_Stack(…

EF Core 数据变更自动审计设计

EF Core 数据变更自动审计设计Intro有的时候我们需要知道每个数据表的变更记录以便做一些数据审计&#xff0c;数据恢复以及数据同步等之类的事情&#xff0c; EF 自带了对象追踪&#xff0c;使得我们可以很方便的做一些审计工作&#xff0c;每次变更发生了什么变化都变得很清晰…

C++ class实现链栈(完整代码)

代码如下: #include <iostream> using namespace std; typedef int ElemType;class StackNode {friend class LinkStack;private:ElemType data;StackNode *next;StackNode(): next(NULL) {}; };class LinkStack {public:LinkStack(): top(NULL) {};~LinkStack() {Stack…

海外服务器维护,海外服务器运行不正常的原因是什么?

要开开展海外贸易业务&#xff0c;您需要选择一个由于客户操作错误&#xff0c;服务器无法正常工作。实际上&#xff0c;在使用服务器时&#xff0c;许多小型企业客户不需要定期维护服务器&#xff0c;只需要建立一个对服务器技能有一点了解的人&#xff0c;而他们需要运行服务…

使用Docker-Compose搭建高可用redis哨兵集群

头脑风暴出于学习目的&#xff0c;您可以很轻松地在docker环境下运行redis的单个实例&#xff0c;但是如果您需要在生产环境中运行它&#xff0c;那么必须将Redis部署为HA(High Avaliable)模式。Redis Sentinel为Redis提供高可用性&#xff0c;这意味着使用Sentinel可以创建Red…