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 << " ";inorder_tree(t->rc);}
}void preorder_tree(BSTNode *t) {if (t != nullptr) {cout << t->v << " ";preorder_tree(t->lc);preorder_tree(t->rc);}
}void postorder_tree(BSTNode *t) {if (t != nullptr) {postorder_tree(t->lc);postorder_tree(t->rc);cout << t->v << " ";}
}BSTNode *t_search_1(BSTNode *t, double k) {if (t == nullptr || k == t->v)return t;if (k < t->v)return  t_search_1(t->lc, k);elsereturn t_search_1(t->rc, k);
}BSTNode *t_search_2(BSTNode *t, double k) {while (t != nullptr && k != t->v) {if (k < t->v)t = t->lc;elset = t->rc;}return t;
}BSTNode *t_min(BSTNode *t) {while (t->lc != nullptr)t = t->lc;return t;
}BSTNode *t_max(BSTNode *t) {while (t->rc != nullptr)t = t->rc;return t;
}BSTNode *t_successor(BSTNode *t) {BSTNode *y;if (t->rc != nullptr)return t_min(t->rc);y = t->par;while (y != nullptr && t == y->rc) {t = y;y = y->par;}return y;
}BSTNode *t_predecessor(BSTNode *t) {BSTNode *y;if (t->lc != nullptr)return t_max(t->lc);y = t->par;while (y != nullptr && t == y->lc) {t = y;y = y->par;}return y;
}void t_insert(BSTNode *&t, double w) {BSTNode *z;z = new BSTNode ;if (z == nullptr)return ;z->v = w;BSTNode *x = t;BSTNode *y = nullptr;while (x != nullptr) {y = x;if (z->v < x->v)x = x->lc;elsex = x->rc;}z->par = y;if (y == nullptr)t = z;else if (z->v < y->v)y->lc = z;elsey->rc = z;
}void transplant(BSTNode *&t, BSTNode *u, BSTNode *v) {if (u->par == nullptr)t = v;else if (u->par->lc == u)u->par->lc = v;elseu->par->rc = v;if (v != nullptr)v->par = u->par;
}BSTNode *t_delete_in(BSTNode *&t, BSTNode *z) {BSTNode *y = nullptr;if (z->lc == nullptr)transplant(t, z, z->rc);else if (z->rc == nullptr)transplant(t, z, z->lc);else {y = t_min(z->rc);if (y->par != z) {transplant(t, y, y->rc);y->rc = z->rc;y->rc->par = y;}transplant(t, z, y);y->lc = z->lc;y->lc->par = y;}return z;
}void t_delete(BSTNode *&t, double w) {BSTNode *z, *node;z = t_search_2(t, w);if (z != nullptr) {node = t_delete_in(t, z);if (node != nullptr) {delete node;node = nullptr;}}
}void t_destory(BSTNode *t) {if (t == nullptr)return ;if (t->lc != nullptr)return t_destory(t->lc);if (t->rc != nullptr)return t_destory(t->rc);delete t;t = nullptr;
}int main() {int n;BSTNode *root;double *arr;cout << "请输入节点/关键字个数:" << endl;cin >> n;arr = new double [n];cout << "请依次输入关键字(注意每棵子树的根节点都要比它的孩子结点先输入): " << endl;for (int i = 0; i < n; i++) {cin >> arr[i];t_insert(root, arr[i]);}cout << endl;cout << "二叉搜索树先序遍历的结果为: ";preorder_tree(root);cout << endl;cout << "二叉搜索树中序遍历的结果为: ";inorder_tree(root);cout << endl;cout << "二叉搜索树后序遍历的结果为: ";cout << endl;postorder_tree(root);cout << endl;double seakey;cout << "请输入要查找的节点关键字:" << endl;cin >> seakey;cout << endl;BSTNode *seaNode  = t_search_1(root, seakey);if (seaNode)cout << "查找成功!" << endl;elsecout << "查找失败, 关键字为" << seakey << "的结点不存在" << endl;cout << endl;double delkey;cout << "请输入要删除的结点关键字: " << endl;cin >> delkey;cout << endl;t_delete(root, delkey);cout << "删除操作后先序遍历二叉搜索树的结果为: ";preorder_tree(root);cout << endl;cout << "删除操作后中序遍历二叉搜索树的结果为: ";inorder_tree(root);cout << endl;t_destory(root);				// 销毁二叉树delete[] arr;system("pause");return 0;
}

测试结果:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

如何用 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…

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

代码如下: #include <iostream> using namespace std; typedef int ElemType;class SeqQueue {public:SeqQueue(int Queuesize 100) {base new ElemType[Queuesize];front 0;rear 0;size Queuesize;};~SeqQueue() {delete[] base;};int Empty_Queue();int En_Queue…

es文件创建局域网服务器,大神来教你XBMC和ES文件浏览器局域网共享

回复可见&#xff0c;谢谢支持~首先电脑要设置&#xff0c;记住电脑的IP地址后面添加局域网用的cd4318d0f703918f9002dcbf523d269758eec45d.jpg (59.67 KB, 下载次数: 7)2014-10-11 10:26 上传ccb48d03918fa0ec39148578259759ee3c6ddb5d.jpg (45.07 KB, 下载次数: 7)2014-10-11…