#include
#include
using namespace std;
template
struct BTNode
{
T _val;
BTNode* _left;
BTNode* _right;
BTNode(const T& val = T())
:_val(val), _left(nullptr), _right(nullptr)
{
}
};
template
class BSTree
{
public:
typedef BTNode Node;
public:
Node* find(const T& val)
{
Node* cur=_root;
while (cur)
{
if (cur->_val == val)
{
return cur;
}
else if (cur->_val < val)
{
cur=cur->_right;
}
else
{
cur=cur->_left;
}
}
return nullptr;
}
bool insert(const T& val)
{
if (_root == nullptr)
{
_root=new Node(val);
return true;
}
Node* parent=nullptr;
Node* cur=_root;
while (cur)
{
parent=cur;
if (cur->_val == val)
{
return false;
}
else if (cur->_val > val)
{
cur=cur->_left;
}
else
{
cur=cur->_right;
}
}
cur=new Node(val);
if (cur->_val > parent->_val)
{
parent->_right=cur;
}
else
{
parent->_left=cur;
}
return true;
}
void inorder()
{
Node* cur=_root;
look(cur);
}
void look(Node* cur)
{
if (cur == nullptr)
{
return;
}
look(cur->_left);
cout<_val;
look(cur->_right);
}
bool erase(const T& val)
{
if (_root == nullptr)
{
return false;
}
Node* parent;
Node* cur = _root;
while (cur)
{
if (cur->_val == val)
{
break;
}
else if (cur->_val > val)
{
parent = cur;
cur = cur->_left;
}
else
{
parent = cur;
cur = cur->_right;
}
}
if (cur == nullptr)
{
return false;
}
if (cur->_left == nullptr && cur->_right == nullptr)
{
if (cur == _root)
{
_root = nullptr;
}
else if (parent->_left == cur)
{
parent->_left = nullptr;
delete cur;
}
else
{
parent->_right = nullptr;
delete cur;
}
}
else if (cur->_left == nullptr)
{
if (cur == _root)
{
_root = _root->_right;
}
else if (parent->_left == cur)
{
parent->_left = cur->_right;
}
else
{
parent->_right = cur->_right;
}
delete cur;
}
else if (cur->_right == nullptr)
{
if (cur == _root)
{
_root = cur->_left;
}
else if (parent->_left = cur)
{
parent->_left = cur->_left;
}
else if (parent->_right = cur)
{
parent->_right = cur->_left;
}
delete cur;
}
else
{
Node* leftMostNode = cur->_right;
Node* par = cur;
while (leftMostNode->_left)
{
par = leftMostNode;
leftMostNode = leftMostNode->_left;
}
cur->_val = leftMostNode->_val;
if (par->_left == leftMostNode)
{
par->_left = leftMostNode->_right;
}
else
{
par->_right = leftMostNode->_right;
}
delete leftMostNode;
}
}
~BSTree()
{
destroy(_root);
}
void destroy(Node* root)
{
if (root == nullptr)
{
return;
}
destroy(root->_left);
destroy(root->_right);
delete root;
}
BSTree()
{
}
BSTree(const BSTree& bs)
{
_root=copy(bs._root);
}
Node* copy(Node* cur)
{
if (cur == nullptr)
{
return nullptr;
}
Node* root=new Node(cur->_val);
root->_left=copy(cur->_left);
root->_right=copy(cur->_right);
return root;
}
BSTree& operator = (const BSTree bs)
{
swap(_root,bs._root);
return this;
}
private:
Node _root=nullptr;
};
void test()
{
BSTreebs;
bs.insert(1);
bs.insert(3);
bs.insert(6);
bs.insert(2);
bs.insert(8);
bs.insert(9);
bs.inorder();
BSTreebs2(bs);
cout<<endl;
BSTreebs3=bs;
bs2.inorder();
bs3.inorder();
}
int main()
{
test();
return 0;
}
相关推荐
SAP SD跨公司销售IDOC自动记账配置实战指南
本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。
完全二叉树基本操作(不含遍历)
/*准备数据*/ #define MANLEN 20 //最大长度 typedef char DATA; //定义元素类型 typedef struct CBT //定义二叉树结点类型 { DATA data; //元素数据 struct CBT* left; ...
前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)
今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...
数据结构之完全二叉树
一、完全二叉树定义 完全二叉树(Complete Binary Tree) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边
Microsoft Defender防病毒扫描添加排除项
Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr
W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法
本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。
判断二叉树是否为完全二叉树
1)完全二叉树的定义是根据满二叉树来的,希望从左往右编号能跟满二叉树对应上,缺只能缺右边,不能缺左边。 2)判断完全二叉树的2个方法,一个事BFS遍历判断,就2个条件,关键看节点是否双全,第一次遇到不双全,今后都得是叶节点,第二个方法是树形DP,画图看看完全二叉树的几个条件。就明白了,自己要理解透彻。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。
Arduino创意作品实战案例:手把手教你做温控风扇
通过这个实用的arduino创意作品,轻松实现温度感应与风扇自动控制,结合传感器与编程逻辑,打造智能散热系统,是入门者理想的arduino创意作品实践项目。
数据结构 - 完全二叉树
分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 完全二叉树是一种效率很高的数据结构,堆就是一种完全二叉树,效率极高。像十分常用的排序算法、Dijkstra算法、Prim算法等等都要用堆才能优化;经常提到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。 完全二叉树(Comp...
基于Freertos与lwip移植FreeModbusTcp协议
基于FreeRTOS的N32G457VEL7之LWIP网络协议栈移植-优快云博客。
基于FPGA的7x7矩阵求逆verilog开发
up目录一、理论基础二、核心程序三、测试结果 矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。 逆矩阵的求法有多种,其中重要
完全二叉树简析
摘要:解释了数据结构树中的重要形态之完全二叉树
CKAD-CN考试之路----12
显然,对应的value都已经实现了加密.保存退出,等待pod重新创建。确认secret是否被加密。编辑secret文件。
完全二叉树的判定
一、完全二叉树的定义 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 (1)所有的叶结点都出现在第k层或k-l层(层次最大的两层) (2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。 一棵二叉树至多只有最下面的两层上的结
IDEA的使用指南
IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.
华为的C语言编程规范.pdf
华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。
完全二叉树标准(详细图解)
标准 完全二叉树是效率很高的数据结构。众所周知,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 特点: (1)所有的叶结点都出现在第k层或k-l层(层次最大的两层) (2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。 我想这个概念大部分人都能理解或者早已通...
大中型超市收银系统(可直接运行)
光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开
数据结构:满二叉树,完全二叉树,非完全二叉树 的区别
数据结构:满二叉树,完全二叉树,非完全二叉树 的区别前言一、满二叉树二、完全二叉树三、非完全二叉树总结 前言 记录下满二叉树,完全二叉树,非完全二叉树的区别 一、满二叉树 如上图所示,这就是一个满二叉树的示例图,从字面上也很好理解,叶子节点外,所有节点都有两个子节点。 二、完全二叉树 完全二叉树就和名字有点不太一样了,除最后一层节点外,其他层节点都必须要有两个子节点,并且最后一层节点都要左排列。 要满足两个条件: 1.除最后一层节点外,其他层节点都必须要有两个子节点 2.最后一层节点都要左排列 像
jre9下载 jdk9
(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】
建立完全二叉树
完全二叉树 对于完全二叉树,按顺序1~n编号,若父节点为i;则左孩子为2i,右孩子为2i+1;若树深度为k,则前k-1为满二叉树;因此判定当2i<=n时,建立左子树,当2i+1<=n时,建立又子树 #include<iostream> #include<stdio.h> #include<malloc.h> #include<queue>...
完全二叉树的判断
完全二叉树(Complete Binary Tree):若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有的节点都连续集中在最左边,这就是完全二叉树。完全二叉树由满二叉树而引起来的。对于深度为K的,有n个节点的二叉树,当且仅当每一个节点都与深度为K的满二叉树中编号从1到n的节点一一对应时称之为完全二叉树。 注意:满二叉树一定是完全二叉树,但完全二叉
判断完全二叉树
完全二叉树的定义: 一棵二叉树,除了最后一层之外都是完全填充的,并且最后一层的叶子结点都在左边。 https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91/7773232?fr=aladdin 百度定义 思路:层序遍历二叉树 如果一个结点,左右孩子都不为空,则pop该节点,将其左右孩子入队列 ...
完全二叉树的判断 与完全二叉树节点个数的计算
首先,完全二叉树的含义就是从左到右依次排满一行再排一行,各节点之间都是相邻的。 判断他是否是完全二叉树, 分情况判断: ① 一个节点有右子树,但是没有左子树那么他一定不是完全二叉树 ② 一个节点的左右子树不满,那说明从他之后的节点都会有子节点,都是叶节点。 那么就利用层级遍历,遇到情况1直接返回false,遇到情况2然后进行标记,看后边节点是否有子节点 有的话直接返回...
完全二叉树你需要了解一下
完全二叉树(Complete Binary Tree)是一种特殊的二叉树,它的定义是:如果设二叉树的深度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。完全二叉树的性质包括:深度为k的完全二叉树,节点数在2k到2k+1−1之间。若根节点编号为1,则第i个节点的编号为i。对于任意一节点i,其左儿子的编号为2i,右儿子的编号为2i+1。如果i不是根节点,它的父节点编号为i/2(向下取整)。
完全二叉树的结点总数问题
一颗完全二叉树第六层有8个叶结点(根为第一层),则结点个数最多有()个。 二叉树第k层最多有 2^(k-1) 个节点 第六层最多有32个节点 第五层最多有16个节点 第四层最多有8个节点 第三层最多有4个节点 第二层最多有2个节点 第一层最多有1个节点 完全二叉树的叶节点只可能出现在后两层 如果完全二叉树有6层,则前5层是满二叉树,总节点数目为1
769



被折叠的 条评论
为什么被折叠?



