完全二叉树

算法-完全二叉树 二叉树作为常见的数据结构,在面试中也经常出现,所以在此记录一些容易忘掉或者容易混淆的二叉树性质和在刷题中碰到的算法。本文仅仅简单介绍了完全二叉树和满二叉树的性质以及如何判断二叉树是否是完全二叉树,而二叉树的类型还有搜索二叉树、平衡二叉树等,之后再遇到二叉树性质相关的题目会再次更新本篇文章。...... 阅读详情

#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;
}

java实现完全二叉树 需求: 使用java构建二叉树,实现先序遍历、中序遍历、后序遍历。 分析: 1、分析二叉树类的属性和功能,即成员变量和成员函数 成员变量:     存储所有节点值的数组和存储所有节点的集合。     二叉树的节点都有值,可以将所有的值存到数组中,并且要以节点形式存在,存到集合中。 成员函数:     创建二叉树(类似于File类,创建File对象功能定义在内部);获取根节点函数 阅读详情

相关推荐

SAP SD跨公司销售IDOC自动记账配置实战指南

本文详细介绍了SAP SD模块中跨公司销售IDOC自动记账的配置实战指南。通过IDOC技术实现集团企业间交易的自动化处理,显著提升财务效率和准确性。文章涵盖前置配置、RFC连接、合作伙伴参数设置及财务科目分配等关键步骤,并提供了常见错误排查和性能优化建议,帮助用户快速掌握这一高效业务流程。

weixin_29284885的博客 769

完全二叉树基本操作(不含遍历)

/*准备数据*/ #define MANLEN 20 //最大长度 typedef char DATA; //定义元素类型 typedef struct CBT //定义二叉树结点类型 { DATA data; //元素数据 struct CBT* left; ...

用可见的方式来记录和分享每一次收获 331

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

数据结构之完全二叉树

一、完全二叉树定义 完全二叉树(Complete Binary Tree) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 一棵二叉树至多只有最下面的一层上的结点的度数可以小于2,并且最下层上的结点都集中在该层最左边的若干位置上,而在最后一层上,右边

weixin_45984250的博客 12万+

Microsoft Defender防病毒扫描添加排除项

Win10与Win11上的“**Microsoft Defender防病毒**”功能默认会自动扫描所有非压缩文件,如果发现病毒或疑似病毒甚至经过手动修改后某些安装文件,会自动将其删除,如果是后面两种情况,则可能会造成误报,对我们正常办公或学习造成不利影响。 此时, 我们可以将某个目录或文件设置为“**Microsoft Defender防病毒不会扫描已排除的项目**”(<red>但要注意:这些被排除的目录或文件会给笔记本造成一定的安全风险,如果真有病毒感染这些目录或文件它们也不会被“**Micr

weixin_42148668的博客 6481

W25N01GV SPI NAND Flash驱动开发避坑指南:详解2KB缓冲区机制与状态寄存器正确用法

本文深入解析W25N01GV SPI NAND Flash芯片的2KB缓冲区机制与状态寄存器正确用法,提供STM32 HAL和ESP-IDF项目的实战解决方案。涵盖双阶段操作原理、状态寄存器深度解析、时序控制优化及跨平台驱动设计要点,帮助开发者避免常见错误并提升存储性能。

aizhouqian5537的博客 640

判断二叉树是否为完全二叉树

1)完全二叉树的定义是根据满二叉树来的,希望从左往右编号能跟满二叉树对应上,缺只能缺右边,不能缺左边。 2)判断完全二叉树的2个方法,一个事BFS遍历判断,就2个条件,关键看节点是否双全,第一次遇到不双全,今后都得是叶节点,第二个方法是树形DP,画图看看完全二叉树的几个条件。就明白了,自己要理解透彻。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 1万+

Arduino创意作品实战案例:手把手教你做温控风扇

通过这个实用的arduino创意作品,轻松实现温度感应与风扇自动控制,结合传感器与编程逻辑,打造智能散热系统,是入门者理想的arduino创意作品实践项目。

weixin_42311427的博客 608

数据结构 - 完全二叉树

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 完全二叉树是一种效率很高的数据结构,堆就是一种完全二叉树,效率极高。像十分常用的排序算法、Dijkstra算法、Prim算法等等都要用堆才能优化;经常提到的二叉排序树的效率也要借助平衡性来提高,而平衡性基于完全二叉树。 完全二叉树(Comp...

了解➔熟悉➔掌握➔精通 6万+

基于Freertos与lwip移植FreeModbusTcp协议

基于FreeRTOS的N32G457VEL7之LWIP网络协议栈移植-优快云博客。

Dd_456456的博客 3239

基于FPGA的7x7矩阵求逆verilog开发

up目录一、理论基础二、核心程序三、测试结果 矩阵求逆,即求矩阵的逆矩阵。矩阵是线性代数的主要内容,很多实际问题用矩阵的思想去解既简单又快捷。逆矩阵又是矩阵理论的很重要的内容,逆矩阵的求法自然也就成为线性代数研究的主要内容之一。设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩B,使得: AB=BA=E。 则我们称B是A的逆矩阵,而A则被称为可逆矩阵。其中,E为单位矩阵。典型的矩阵求逆方法有:利用定义求逆矩阵、初等变换法、伴随阵法、恒等变形法等。 逆矩阵的求法有多种,其中重要

FPGA/MATLAB学习教程/源码/项目合作开发 3898

完全二叉树简析

摘要:解释了数据结构树中的重要形态之完全二叉树

云杉木屋 1万+

CKAD-CN考试之路----12

显然,对应的value都已经实现了加密.保存退出,等待pod重新创建。确认secret是否被加密。编辑secret文件。

Q先生 446

完全二叉树的判定

一、完全二叉树的定义 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 (1)所有的叶结点都出现在第k层或k-l层(层次最大的两层) (2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。 一棵二叉树至多只有最下面的两层上的结

weixin_45970688的博客 3900

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

完全二叉树标准(详细图解)

标准 完全二叉树是效率很高的数据结构。众所周知,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 特点: (1)所有的叶结点都出现在第k层或k-l层(层次最大的两层) (2)对任一结点,如果其右子树的最大层次为L,则其左子树的最大层次为L或L+l。 我想这个概念大部分人都能理解或者早已通...

@宝藏男孩 7万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

数据结构:满二叉树,完全二叉树,非完全二叉树 的区别

数据结构:满二叉树,完全二叉树,非完全二叉树 的区别前言一、满二叉树二、完全二叉树三、非完全二叉树总结 前言 记录下满二叉树,完全二叉树,非完全二叉树的区别 一、满二叉树 如上图所示,这就是一个满二叉树的示例图,从字面上也很好理解,叶子节点外,所有节点都有两个子节点。 二、完全二叉树 完全二叉树就和名字有点不太一样了,除最后一层节点外,其他层节点都必须要有两个子节点,并且最后一层节点都要左排列。 要满足两个条件: 1.除最后一层节点外,其他层节点都必须要有两个子节点 2.最后一层节点都要左排列 像

水光涵月的博客 1万+

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&gt...

weixin_43956284的博客 5320

完全二叉树的判断

完全二叉树(Complete Binary Tree):若设二叉树的深度为h,除第h层外,其他各层(1~h-1)的节点数都达到最大个数,第h层所有的节点都连续集中在最左边,这就是完全二叉树。完全二叉树由满二叉树而引起来的。对于深度为K的,有n个节点的二叉树,当且仅当每一个节点都与深度为K的满二叉树中编号从1到n的节点一一对应时称之为完全二叉树。 注意:满二叉树一定是完全二叉树,但完全二叉

he_shuai20的博客 5081

判断完全二叉树

完全二叉树的定义: 一棵二叉树,除了最后一层之外都是完全填充的,并且最后一层的叶子结点都在左边。 https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91/7773232?fr=aladdin 百度定义   思路:层序遍历二叉树 如果一个结点,左右孩子都不为空,则pop该节点,将其左右孩子入队列 ...

少说,多做。 4万+

完全二叉树的判断 与完全二叉树节点个数的计算

首先,完全二叉树的含义就是从左到右依次排满一行再排一行,各节点之间都是相邻的。 判断他是否是完全二叉树, 分情况判断: ① 一个节点有右子树,但是没有左子树那么他一定不是完全二叉树 ② 一个节点的左右子树不满,那说明从他之后的节点都会有子节点,都是叶节点。 那么就利用层级遍历,遇到情况1直接返回false,遇到情况2然后进行标记,看后边节点是否有子节点 有的话直接返回...

weixin_41298572的博客 1748

完全二叉树你需要了解一下

完全二叉树(Complete Binary Tree)是一种特殊的二叉树,它的定义是:如果设二叉树的深度为h,除第h层外,其它各层(1~h-1)的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树。完全二叉树的性质包括:深度为k的完全二叉树,节点数在2k到2k+1−1之间。若根节点编号为1,则第i个节点的编号为i。对于任意一节点i,其左儿子的编号为2i,右儿子的编号为2i+1。如果i不是根节点,它的父节点编号为i/2(向下取整)。

技术人集结地 4642

完全二叉树的结点总数问题

一颗完全二叉树第六层有8个叶结点(根为第一层),则结点个数最多有()个。 二叉树第k层最多有 2^(k-1) 个节点 第六层最多有32个节点 第五层最多有16个节点 第四层最多有8个节点 第三层最多有4个节点 第二层最多有2个节点  第一层最多有1个节点 完全二叉树的叶节点只可能出现在后两层 如果完全二叉树有6层,则前5层是满二叉树,总节点数目为1

You_are_my_dream的博客 1万+
上一篇: list类的基本实现和常用的接口
下一篇: 线程池
ldbite
博客等级 码龄7年 17粉丝 195原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值