二叉树基本概念与遍历

什么是二叉树

二叉树不同于别的树,因为他每个节点最多只有两个子节点,而别的树可以有无数个子节点。
所以二叉树就是只最多只有两个子节点的树,一个子节点叫右子节点,另一个子节点叫左子结点
而他们的上一层就是父子节点,最上层叫根节点

在这里插入图片描述

二叉树的种类

二叉树分三个种类普通二叉树,满二叉树,完全二叉树
普通二叉树不用说,先说说满二叉树

满二叉树

在这里插入图片描述
我们可以通过他的名字就可以知道---------它的每个节点都有两个子节点(除了最后一层),而且每一层节点数都是满的。
我们可以观察一下每层节点的个数,1,2,4,8…,观察下,这不就是等差数列嘛,,但是用等差数列不能够发现特点,所以我们可以将它换个形态:2^0, 2^1, 2^2, 2^3…
所以满二叉树每个层的节点数是2^(k-1)个(k是层数),再根据这个特点我们同样也可以结合等差数列推出每个满二叉树的总结的数: 2^k-1(k总层数)

完全二叉树

在这里插入图片描述

完全二叉树的概念是每层从左到右不断的叫完全二叉树(看不懂可以看图)比如图上就是个典范的完全二叉树,但下图就不是完全二叉树
在这里插入图片描述

为什么他不是呢因为6号位的左子节点没有,但有右子节点,而右子节点没有和5号位的右子节点连通
所以不构成完全二叉树
完全二叉树的特点:其实满二叉树属于特殊的完全二叉树,所以完全二叉树的每一层(除了最后一层)的节点数也是2^(k-1)(k层数),而完全二叉树的总结点数是前(k-1)层的总节点数+最后一层的节点数。

二叉树c++代码

了解完二叉树就可以代码了
二叉树的初始化
二叉树的初始化有两种
第一种struct

typedef struct node
{char date; //父子节点struct node *left;//左子结点struct node *right;	//右子节点
}BiTNode; BiTNode *creatBiTree()
{char k;cin>>k;if(k=='#')return NULL;BiTNode *T=(BiTNode *)malloc(sizeof(BiTNode));T->data=k;   //父子节点//递归T->left=creatBiTree();//左子结点T->right=creatBiTree();//右子节点return T;
}

第二种数组(个人比较喜欢数组)

int ab[105][2];
for(循环){
ab[i][0]=b;    //左子结点
ab[i][1]=c;   //右子节点
}

二叉树的遍历

二叉树的遍历主要是递归

先序遍历

父子节点->左子结点->右子节点

void dfs1(int x){if(x==0){return ;}cout<<x<<" ";dfs1(ab[x][0]);dfs1(ab[x][1]);
}

中序遍历

左子结点->父子节点->右子节点


void dfs2(int x){if(x==0){return ;}dfs2(ab[x][0]);cout<<x<<" ";dfs2(ab[x][1]);
}

后序遍历

左子结点->右子节点->父子节点


void dfs3(int x){if(x==0){return ;}dfs3(ab[x][0]);dfs3(ab[x][1]);cout<<x<<" ";
}

最后是一道题目

二叉树遍历加强版

时间限制:1 s内存限制:128 MB
二叉树的每个结点包含一个大写字母,且两两不同。

给出二叉树的前序遍历和中序遍历,求后序遍历。

输入
第一行给出一个字符串表示前序遍历。

第二行给出一个字符串表示中序遍历。

遍历结果只由大写字母组成,非空,且长度不超过26。

输出
输出后序遍历的结果。
样例
输入 1
DBACEGF
ABCDEFG
输出 1
ACBFGED
输入 2
BCAD
CBAD
输出 2
CDAB
【分析】其实这道题的思路很简单就是先构造树再后序遍历,当然有思路可是怎么构造二叉树是个问题,不过不如我们先观察

在这里插入图片描述
观察后我们可以发现中序遍历中根节点的左边是整个左子树,右边是整个右子树
这就很简单了,每次递归左子树和右子树就可以构造出整个树,随后再回溯,获取每棵子树的根节点
代码如下

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<char>ans;
void dfs(int l1,int r1,int l2,int r2){if(l1>r1||l2>r2){return ;}int p=-1;for(int i=l2;i<=r2;i++){if(b[i]==a[l1]){p=i;break;}}int len=p-l2;dfs(l1+1,l1+len,l2,l2+len-1);//访问左子树dfs(l1+len+1,r1,p+1,r2);//访问右子树ans.push_back(a[l1]);
}
int main()
{
cin>>a>>b;
int n=a.size();
dfs(0,n-1,0,n-1);
for(int i=0;i<n;i++) cout<<ans[i];return 0;
}

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

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

相关文章

TCP和UDP的使用方法和注意事项

文章目录 客户端和服务器TCP和UDP的特点UDP socket api的使用DatagramSocketDatagramPacketInetSocketAddress API 做一个简单的回显服务器UDP版本的回显服务器TCP版本的回显服务器 客户端和服务器 在网络中&#xff0c;主动发起通信的一方是客户端&#xff0c;被动接受的这一方…

OpenAI最新Sora视频学习与生成的技术分析与最新体验渠道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

2024阿里云云服务器ECS价格表出炉

2024年最新阿里云服务器租用费用优惠价格表&#xff0c;轻量2核2G3M带宽轻量服务器一年61元&#xff0c;折合5元1个月&#xff0c;新老用户同享99元一年服务器&#xff0c;2核4G5M服务器ECS优惠价199元一年&#xff0c;2核4G4M轻量服务器165元一年&#xff0c;2核4G服务器30元3…

MBD_入门篇_17_Simulink逻辑和位运算模块

17.Simulink逻辑和位运算模块 17.1 概述 Logic And Bit Operation&#xff0c;逻辑和位运算操作模块。 17.2 逻辑运算模块LogicalOperator 可以对输入做与、或、非、异或等逻辑运算。 简单示例。 17.3 比较运算模块RelationOperation 比较两个数的大小等运算。 注意&#xff0c…

QT中事件过滤器

Qt添加事件过滤器&#xff0c;设置拖放listWidget、TreeWidget、TableWidget控件。 #include "mainwindow.h" #include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this)…

【JAVA】《接口,抽象方法,抽象类 》之二 、抽象方法详解

抽象方法 详解 一、接口二、抽象方法2.1、抽象方法概念2.2、抽象方法的特点&#xff1a;2.3、抽象方法的作用&#xff1a;2.4、抽象方法的应用&#xff1a;2.5、抽象方法的实践&#xff1a;2.6、使用抽象方法的注意事项 三、抽象类四、开发实践 一、接口 1.1、接口的概念 1.2、…

如何利用Idea创建一个Servlet项目(新手向)

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;如何利用Idea创建一个Servlet项目(新手向) Servlet是tomcat的api,利用Servlet进行webapp开发很方便,本文将介绍如何通过Idea创建一个Servlet项目(一共分为七步,这可能是我们写过的…

简介高效的 CV 入门指南: 100 行实现 ConvNext 图像分类

简介高效的 CV 入门指南: 100 行实现 ConvNext 图像分类 概述ConvNext架构创新参数效率计算效率100 行代码实现 ConvNext 图像分类ConvNext tinyConvNext Base 概述 在当今快速发展的人工智能领域, 计算机视觉 (Computer Vision, CV) 已称为一个关键的研究和应用领域. CV 可以…

学习鸿蒙基础(4)

1.条件渲染 ArkTS提供了渲染控制的能力。条件渲染可根据应用的不同状态&#xff0c;使用if、else和else if渲染对应状态下的UI内容。 当if、else if后跟随的状态判断中使用的状态变量值变化时&#xff0c;条件渲染语句会进行更新。。 Entry Component struct PageIfElse {Stat…

统信操作系统下数据库管理利器

PL/SQL是一款荷兰公司开发的数据库管理软件&#xff0c;尽管只支持Oracle一种数据库&#xff0c;但是在这一种数据库的支持上深度耕耘了30年&#xff0c;做到了Oracle管理的极致&#xff0c;从而拥有量海量的用户。 当然&#xff0c;随着时间的推移&#xff0c;PL/SQL也出现了一…

鸿蒙-基于ArkTS声明式开发的简易备忘录,适合新人学习,可用于大作业

本文地址&#xff1a;https://blog.csdn.net/qq_40785165/article/details/136161182?spm1001.2014.3001.5502&#xff0c;转载请附上此链接 大家好&#xff0c;我是小黑&#xff0c;一个还没秃头的程序员~~~ 不知不觉已经有很长一段时间没有分享过自己写的东西了&#xff0…

QPainter绘图与QPen、QFont及QBrush详细用法

一.基本绘图属性&#xff1a; 1.基本绘图类&#xff1a; Qt的绘图功能基于QPainter、QPainterDevice和QPainterEngine三个类。QPainter类在窗口和其他绘制设备上执行低级绘制。它提供高度优化的功能来完成大多数图形用户界面程序所需的工作&#xff0c;包括绘制基本的点、线、…