【数据结构 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.mzph.cn/news/657429.shtml

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

相关文章

CRF条件随机场学习记录

阅读建议 仔细阅读书[1]对应的序列标注章节&#xff0c;理解该方法面向的问题以及相关背景&#xff0c;然后理解基础的概念。 引言 威胁情报挖掘的相关论文中&#xff0c;均涉及到两部分任务&#xff1a;命名实体识别&#xff08;Named Entity Recognition&#xff0c;NER&a…

android学习笔记----ListView和各种适配器简介

打气筒&#xff08;LayoutInflater对象&#xff09;介绍&#xff1a; MainActivity.java import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import an…

Springboot 实现基于用户和物品的协同过滤算法

目录 简介 协同过滤算法(简称CF) 算法详解 算法使用 基于用户 基于物品 总结 前言-与正文无关 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停…

对作用域链的理解(详细解析)

文章目录 一、作用域全局作用域函数作用域块级作用域 二、词法作用域三、作用域链 一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变…

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

腾讯云0基础10秒搭建幻兽帕鲁游戏联机服务器

幻兽帕鲁&#xff08;Palworld&#xff09;是一款多人在线游戏&#xff0c;为了获得更好的游戏体验&#xff0c;需要搭建一个稳定、高效的游戏联机服务器。腾讯云提供了一种简单、快速的方法&#xff0c;让新手小白也能0基础10秒搭建幻兽帕鲁游戏联机服务器&#xff01; 本文将…

计算机网络_1.2因特网概述

1.2因特网概述 一、网络、互联网与因特网的区别与联系1、网络2、互联网3、因特网4、 互联网与因特网辨析 二、因特网介绍1、因特网发展的三个阶段2、因特网简介&#xff08;1&#xff09;因特网服务提供者&#xff08;ISP&#xff09;&#xff08;2&#xff09;因特网已经发展成…

基于Springboot的视频网站系统的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的视频网站系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

ESP8266 传感器搭配 Node-RED实时显示数据,邮件告警 实验

前言 esp8266 12f,wif模块,接倾斜传感器,火焰传感器,烟雾传感器,水浸传感器,蜂鸣器。通过mqtt发布数据,并使用node-red实时获取数据,显示到页面上。并且通过邮件和页面两种方式报警。 需求如下: ①倾斜传感器:监测是否保持平衡。UI界面显示平衡度。如果不平衡,UI界…

Observability:在 Elastic Stack 8.12 中使用 Elastic Agent 性能预设

作者&#xff1a;来自 Elastic Nima Rezainia, Bill Easton 8.12 中 Elastic Agent 性能有了重大改进 最新版本 8.12 标志着 Elastic Agent 和 Beats 调整方面的重大转变。 在此更新中&#xff0c;Elastic 引入了 Performance Presets&#xff0c;旨在简化用户的调整过程并增强…

上位机图像处理和嵌入式模块部署(视频处理vs图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 从目前发展的情况来看&#xff0c;视频处理会慢慢变成一种主流趋势。这里面的原因很多&#xff0c;比如说现在嵌入式soc的算力越来越强、获取图像的…

如何从视频中提取高清图片?可以这样截取

如何从视频中提取高清图片&#xff1f;从视频中提取高清图片可以方便我们制作各种用途所需的素材&#xff0c;如海报、社交媒体配图等。此外&#xff0c;高清图片的细节和色彩也更丰富&#xff0c;可以更好地满足我们的视觉需求。从视频中提取高清图片是一项需要技巧的任务&…

Gateway API 实践之(六)FSM Gateway 的健康检查功能

FSM Gateway 流量管理策略系列&#xff1a; 故障注入黑白名单访问控制限速重试会话保持健康检查负载均衡算法TLS 上游双向 TLS 网关的健康检查功能是一种自动化监控机制&#xff0c;用于定期检查和验证后端服务的健康状况&#xff0c;确保流量只被转发到那些健康且能正常处理请…

Java流程控制for 标签的使用

目录 for语法结构举例breakcontinuereturn 标签 for for循环语句是支持迭代的一种通用结构&#xff0c;是最有效、最灵活的循环结构。for循环在第一次反复之前要进行初始化&#xff0c;即执行初始表达式&#xff1b;随后&#xff0c;对布尔表达式进行判定&#xff0c;若判定结果…

学习鸿蒙基础(2)

arkts是声名式UI DevEcoStudio的右侧预览器可以预览。有个TT的图标可以看布局的大小。和html的布局浏览很像。 上图布局对应的代码&#xff1a; Entry //入口 Component struct Index {State message: string Hello Harmonyos //State 数据改变了也刷新的标签build() {Row()…

C++ 数论相关题目,博弈论,SG函数,集合-Nim游戏

给定 n 堆石子以及一个由 k 个不同正整数构成的数字集合 S 。 现在有两位玩家轮流操作&#xff0c;每次操作可以从任意一堆石子中拿取石子&#xff0c;每次拿取的石子数量必须包含于集合 S &#xff0c;最后无法进行操作的人视为失败。 问如果两人都采用最优策略&#xff0c;…

PEI是聚醚酰亚胺(Polyetherimide)主要应用于哪些行业领域?

聚醚酰亚胺&#xff08;Polyetherimide&#xff0c;PEI&#xff09;由于其优异的性能&#xff0c;被广泛应用于多个工业领域。以下是PEI主要应用的一些行业领域&#xff1a; 1.航空航天工业&#xff1a; PEI的高温稳定性和机械性能使其在航空航天领域中成为一种理想的材料。它用…

系统架构设计师-21年-下午题目

系统架构设计师-21年-下午题目 更多软考知识请访问 https://ruankao.blog.csdn.net/ 试题一必答&#xff0c;二、三、四、五题中任选两题作答 试题一 (25分) 说明 某公司拟开发一套机器学习应用开发平台&#xff0c;支持用户使用浏览器在线进行基于机器学习的智能应用开发…

抵御.360勒索病毒威胁:解密文件的有效方法与预防措施

导言&#xff1a; 近来&#xff0c;网络犯罪的一种新型形式——.360勒索病毒&#xff0c;备受关注。这种病毒通过加密用户文件&#xff0c;要求支付赎金以获取解密密钥。本文91数据恢复将深入介绍.360勒索病毒的特点&#xff0c;同时提供一些有效的恢复方法&#xff0c;并分享…

OpenAI最近推出了ChatGPT的一个新功能,@GPT

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…