【数据结构 06】二叉树

一、原理

二叉树算法核心思维:递归

满二叉树:二叉树的层数为K,节点数为2^K - 1

完全二叉树:二叉树的层数为K,前K-1层是满的,第K层是连续的

满二叉树是完全二叉树的子集。

任意二叉树:若叶子节点的个数是n_o,设度为2(有2个子节点)的节点个数是n_2,则n_0 = n_2 + 1

二叉树的第i层上最多有2^{i-1}个节点,第n个节点的满二叉树深度h = \lg (n+1)

二叉树可以顺序存储或链式存储。

二、BinaryTree.h

#define _CRT_SECURE_NO_WARNINGS 1#pragma
#include <iostream>
#include <string>
#include <cassert>
using namespace std;typedef char DataType;struct BinaryTreeNode
{DataType data;BinaryTreeNode* left;BinaryTreeNode* right;BinaryTreeNode(DataType x): data(x), left(nullptr), right(nullptr){}
};class BinaryTree
{typedef BinaryTreeNode Node;
public:// 构建,指定构造数据序列void Create(const DataType* datas, int& i){_root = _Create(datas, i);}// 先序遍历(根、左、右)void PreOrder(){_PreOrder(_root);cout << ",先序遍历结束" << endl;}// 中序遍历void InOrder(){_InOrder(_root);cout << ",中序遍历结束" << endl;}// 后序遍历void PastOrder(){_PastOrder(_root);cout << ",后序遍历结束" << endl;}// 总节点数int Size(){int num = 0;_Size(_root, num);return num;}// 叶子节点数int LeafSize(){int leafNum = 0;_LeafSize(_root, leafNum);return leafNum;}// 深度(层数)int Depth(){return _Depth(_root);}// 子树数量int TreeSize(){return _TreeSize(_root);}// 销毁void Destroy(){_Destroy(_root);_root = nullptr;cout << "二叉树销毁成功" << endl;}private:Node* _Create(const DataType* datas, int& i){if (datas[i] == '#')return nullptr;Node* root = new Node(datas[i]);root->left = _Create(datas, ++i);root->right = _Create(datas, ++i);return root;}void _PreOrder(Node* root){if (root == nullptr){cout << "# ";return;}cout << root->data << ' ';_PreOrder(root->left);_PreOrder(root->right);}void _InOrder(Node* root){if (root == nullptr){cout << "# ";return;}_InOrder(root->left);cout << root->data << ' ';_InOrder(root->right);}void _PastOrder(Node* root){if (root == nullptr){cout << "# ";return;}_PastOrder(root->left);_PastOrder(root->right);cout << root->data << ' ';}void _Size(Node* root, int& num){if (root == nullptr)return;++num;_Size(root->left, num);_Size(root->right, num);}void _LeafSize(Node* root, int& leafNum){if (root == nullptr)return;if (root->left == nullptr && root->right == nullptr)leafNum++;_LeafSize(root->left, leafNum);_LeafSize(root->right, leafNum);}int _Depth(Node* root){if (root == nullptr)return 0;int leftDepth = _Depth(root->left);int rightDepth = _Depth(root->right);return (leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1);}int _TreeSize(Node* root){if (root == nullptr)return 0;return (root->left == nullptr && root->right == nullptr) ? 0 :_TreeSize(root->left) + _TreeSize(root->right) + 1;}void _Destroy(Node* root){if (root == nullptr)return;_Destroy(root->left);_Destroy(root->right);cout << root->data << "销毁,";delete root;}private:Node* _root;
};

三、test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "BinaryTree.h"int main()
{cout << "--Test1---" << endl << "数据序列: 123###45##6##" << endl;BinaryTree bt;// 构建二叉树int i = 0;bt.Create("123###45##6##", i);bt.PreOrder();bt.InOrder();bt.PastOrder();// 计算二叉树节点总数cout << "二叉树节点总数为:" << bt.Size() << endl; // 6// 计算二叉树叶子结点数cout << "二叉树叶子结点数为:" << bt.LeafSize() << endl; // 3// 计算二叉树深度cout << "二叉树深度:" << bt.Depth() << endl; // 3// 计算二叉树子树数量cout << "二叉树子树数量:" << bt.TreeSize() << endl; // 3// 销毁二叉树bt.Destroy(); // 3销毁,2销毁,5销毁,6销毁,4销毁,1销毁,二叉树销毁成功// 计算二叉树节点总数cout << "二叉树节点总数为:" << bt.Size() << endl;return 0;
}

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

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

相关文章

2024-01-07-AI 大模型全栈工程师 - 做自己的产品经理

摘要 2024-01-07 周日 杭州 阴 本节内容: a. 如何做好独立开发设计&#xff0c;实现财富自由&#xff1b; 课程内容 1. 独立开发者 英文 indie hacker&#xff0c;是指独立开发软件产品的人&#xff1b;一人承担一个项目产品的所有工作&#xff1b; 2. 创业机会 云计算设…

学习使用Flask模拟接口进行测试

前言 学习使用一个新工具&#xff0c;首先找一段代码学习一下&#xff0c;基本掌握用法&#xff0c;然后再考虑每一部分是做什么的 Flask的初始化 app Flask(__name__)&#xff1a;初始化&#xff0c;创建一个该类的实例&#xff0c;第一个参数是应用模块或者包的名称 app…

Java宝典-数据类型

目录 1.变量与常量2.Java中的数据类型3.整型3.1 字节型byte3.2 短整型short3.3 整型int3.4 长整型long 4.浮点型4.1 单精度浮点型float4.2 双精度浮点型double 5.字符型6.布尔型7.类型转换7.1 隐式类型转换7.2 显示类型转换(强制类型转换) 8.类型提升 大家好,我是你们的Vampire…

华为数通方向HCIP-DataCom H12-821题库(单选题:401-420)

第401题 R1的配置如图所示,此时在R1查看FIB表时,关于目的网段192.168.1.0/24的下跳是以下哪一项? A、10.0.23.3 B、10.0.12.2 C、10.0.23.2 D、10.0.12.1 【答案】A 【答案解析】 该题目考查的是路由的递归查询和 RIB 以及 FIB 的关系。在 RIB 中,静态路由写的是什么,下…

PPT录屏功能在哪?一键快速找到它!

在现代办公环境中&#xff0c;ppt的录屏功能日益受到关注&#xff0c;它不仅能帮助我们记录演示文稿的播放过程&#xff0c;还能将操作过程、游戏等内容完美录制下来。可是很多人不知道ppt录屏功能在哪&#xff0c;本文将为您介绍ppt录屏的打开方法&#xff0c;以帮助读者更好地…

网络原理TCP/IP(2)

文章目录 TCP协议确认应答超时重传连接管理断开连接 TCP协议 TCP全称为"传输控制协议(Transmission Control Protocol").⼈如其名,要对数据的传输进⾏⼀个详细 的控制; TCP协议段格式 • 源/目的端口号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认…

spring问题点

1.事务 1.1.事务传播 同一个类中 事务A调非事务B B抛异常 AB事务生效&#xff08;具有传播性&#xff09; 同一个类中 事务A调非事务B A抛异常 AB事务生效 也就是主方法加了事务注解 则方法内调用的其他本类方法无需加事务注解&#xff0c; 发生异常时可以保证事务的回滚 最常…

day07-CSS高级

01-定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 left right top bottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置 显示模…

跟着cherno手搓游戏引擎【14】封装opengl

本节先把代码粘上&#xff0c;后续会慢慢把注释都给加上&#xff0c;先看代码了解个大概&#xff08;待更新&#xff09; 前置&#xff1a; RendererAPI.h: #pragma once namespace YOTO {enum class RendererAPI {None 0,OpenGL1};class Renderer {public:inline static R…

(每日持续更新)jdk api之NotSerializableException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

Flink 流式读取 Debezium CDC 数据写入 Hudi 表无法处理 -D / Delete 消息

问题场景是&#xff1a;使用 Kafka Connect 的 Debezium MySQL Source Connector 将 MySQL 的 CDC 数据 &#xff08;Avro 格式&#xff09;接入到 Kafka 之后&#xff0c;通过 Flink 读取并解析这些 CDC 数据&#xff0c;然后以流式方式写入到 Hudi 表中&#xff0c;测试中发现…

【爬虫专区】批量下载PDF (无反爬)

天命&#xff1a;只要没反爬&#xff0c;一切都简单 这次爬取的是绿盟的威胁情报的PDF 先看一下结构&#xff0c;很明显就是一个for循环渲染 burp抓包会发现第二次接口请求 接口请求一次就能获取到了所有的数据 然后一个循环批量下载数据即可&#xff0c;其实没啥难度的 imp…

如何安装MySQL

如何安装MySQL 前提条件下载MySQL在 Windows 上安装 MySQL验证 MySQL 安装 MySQL是当今工业界广泛使用的最流行的关系数据库管理软件之一。它通过各种存储引擎提供多用户访问支持。它得到了甲骨文公司的支持。在本节中&#xff0c;我们将学习如何为初学者下载和安装 MySQL。 前…

安卓相对布局RelativeLayout

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"150dp"><TextViewandroid…

在VM虚拟机搭建NFS服务器

NFS共享要求如下&#xff1a; &#xff08;1&#xff09;共享“/mnt/自已姓名的完整汉语拼音”目录&#xff0c;允许XXX网段的计算机访问该共享目录&#xff0c;可进行读写操作。&#xff08;说明&#xff1a;XXX网段&#xff0c;请根据你的规划&#xff0c;再具体指定&#xf…

完整的 HTTP 请求所经历的步骤及分布式事务解决方案

1. 对分布式事务的了解 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c; 特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 首先要搞清楚&#xff1a;ACID、CAP、BASE理论。 ACID 指数据库事务正确执行…

【C语言刷题系列】喝汽水问题

文章目录 一、文章简介 1.先买再换 1.1 代码逻辑&#xff1a; 1.2 完整代码 1.3 运行结果 1.4 根据方法一总结优化 2.边买边换 2.1 代码逻辑&#xff1a; 2.2 完整代码 2.3 运行结果 一、文章简介 本文所述专栏——C语言经典编程问题 C语言刷题_倔强的石头106的博客…

unity3d的海盗王白银城演示

这是一个外网上的下载的海盗王unity3d制作的白银城演示场景。 地图只含有白银城区&#xff0c;没有野外和怪物。 当然也没有服务器端的。 我对灯光、摄像头、天空背景等做过调整&#xff0c;使它显示起来比较鲜丽。 它的模型和贴图是直接拿了海盗的&#xff0c;没有做过优化调整…

【算法与数据结构】139、LeetCode单词拆分

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题可以看做一个动态规划问题。其中&#xff0c;字符串s是背包&#xff0c;而字典中的单词就是物品。…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…