【中等】保研/考研408机试-二叉树相关

news2024/11/18 6:36:26

目录

一、基本二叉树

1.1结构

1.2前序遍历(注意三种遍历中Visit所在的位置)

1.2中序遍历

1.3后序遍历

二、真题实战

2.1KY11 二叉树遍历(清华大学复试上机题)【较难】

2.2KY212 二叉树遍历二叉树遍历(华中科技大学复试题)【中等】


一、基本二叉树

1.1结构

首先定义二叉树的结构

struct TreeNode{
	//数据类型 变量;
	char data;
	TreeNode *leftChild;  //左子树 
	TreeNode *rightChild; //右子树 
	TreeNode(char x) : data(x), leftChild(NULL), rightChild(NULL) {}
};

 关于建树,看玩遍历后看题解。

1.2前序遍历(注意三种遍历中Visit所在的位置

Visit是访问格式,比如print输出,不一定是函数

访问根节点-左子树-右子树,遍历过程可以想成逆时针。如图所示。

void PreOrder(TreeNode* root){
	if(root==NULL){
		return;
	}
	Visit(root->data);
	PreOrder(root->leftChild);
	PreOrder(root->rightChild);
	return ;
}

1.2中序遍历

左-中-右

void InOrder(TreeNode* root){
	if(root==NULL){
		return ;
	}
	InOrder(root->leftChild);
	Visit(root->data);
	InOrder(root->rightChild);
	return ;
}

1.3后序遍历

左-右-根

void PostOrder(TreeNode* root){
	if(root==NULL){
		return ;
	}
	PostOrder(root->leftChild);
	PostOrder(root->rightChild);
	Visit(root->data);
	return ;
}

1.4层次遍历

暂时没有遇到,先不更,需要用到 队列辅助更新。

二、真题实战

2.1KY11 二叉树遍历(清华大学复试上机题)【较难】

二叉树遍历_牛客题霸_牛客网

描述

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

输入描述:

输入包括1行字符串,长度不超过100。

输出描述:

可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。

示例1

输入:

abc##de#g##f###

复制输出:

c b e g d f a 

总结:注意建立树的顺序和所需变量,root->leftChild或者root->rightChild的赋值。异常情况返回NULL,以及最后返回root。整体就是:确定结构-建树方法-遍历方法-主程序。

#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
	//数据类型 变量;
	char data;
	TreeNode *leftChild;  //左子树 
	TreeNode *rightChild; //右子树 
	TreeNode(char x) : data(x), leftChild(NULL), rightChild(NULL) {}
};

//建树 先序遍历 中-左-右 
TreeNode* PreBuild(int& index,string s ){
	char c=s[index];
	index++;
	if(c=='#'){
		return NULL;
	}
	TreeNode* root=new TreeNode(c);
	root->leftChild=PreBuild(index,s);
	root->rightChild=PreBuild(index,s);
	return root;
}

void InOrder(TreeNode* root){
	if(root==NULL){
		return ;
	}
	InOrder(root->leftChild);
	cout<<root->data<<" ";
	InOrder(root->rightChild);
	return ;
}


int main() {
	string s;
	while(cin>>s){
		int index=0;
		TreeNode* root=PreBuild(index,s);
		
		InOrder(root);
	}
    
    return 0;
}

2.2KY212 二叉树遍历二叉树遍历(华中科技大学复试题)【中等】

二叉树遍历_牛客题霸_牛客网

描述

二叉树的前序、中序、后序遍历的定义: 前序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树; 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树; 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根。

给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历)。

输入描述:

两个字符串,其长度n均小于等于26。 第一行为前序遍历,第二行为中序遍历。 二叉树中的结点名称以大写字母表示:A,B,C....最多26个结点。

输出描述:

输入样例可能有多组,对于每组测试样例, 输出一行,为后序遍历的字符串。

示例1

输入:

ABC
BAC
FDXEAG
XDEFAG

复制输出:

BCA
XEDGAF

总结:我感觉这个建树比上一个难许多,整道题就是考察建树。

根据先序遍历的性质,第一个节点就是根节点,根据这个入手。(做题时一定要结合数据结构的特性) 

再根据中序遍历的性质,找到根节点索引位置的话,左边的就是左子树,右边的就是右子树。再递归处理。

这个根节点索引位置前序遍历字符串中序遍历字符串都能用,都是分块节点。

递归停止的标志就是先序遍历字符串长度为0,返回NULL(空节点)

函数解释:sub = str.substr(7, 5); // 从索引为7的位置提取长度为5的子字符串

sub = str.substr(7);代表从索引7开始到末尾的所有字符串 。

#include<bits/stdc++.h>
using namespace std;
struct TreeNode{
	char data;
	TreeNode* leftChild;
	TreeNode* rightChild;
	TreeNode(char c):data(c),leftChild(NULL),rightChild(NULL){
	}
};
TreeNode* Build(string s1,string s2){
	if(s1.size()==0){
		return NULL;
	}
	char c=s1[0];
	TreeNode* root=new TreeNode(c);
	int index=s2.find(c);
	root->leftChild=Build(s1.substr(1,index),s2.substr(0,index));
	root->rightChild=Build(s1.substr(index+1),s2.substr(index+1));
	return root; 
}

void PostOrder(TreeNode* root){
	if(root==NULL){
		return;
	}
	PostOrder(root->leftChild);
	PostOrder(root->rightChild);
	cout<<root->data;
	
	
	return ;
}

int main() 
{
    string s1,s2,s3,s4;
    cin>>s1>>s2>>s3>>s4;
    TreeNode* root=Build(s1,s2);
    PostOrder(root);
    cout<<endl;
    TreeNode* root2=Build(s3,s4);
    PostOrder(root2);

    return 0;
}

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

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

相关文章

印度交易所股票行情数据API接口

1. 历史日线 # Restful API https://tsanghi.com/api/fin/stock/XNSE/daily?token{token}&ticker{ticker}默认返回全部历史数据&#xff0c;也可以使用参数start_date和end_date选择特定时间段。 更新时间&#xff1a;收盘后3~4小时。 更新周期&#xff1a;每天。 请求方式…

基于SSM SpringBoot vue办公自动化计划管理系统

基于SSM SpringBoot vue办公自动化计划管理系统 系统功能 登录注册 个人中心 员工信息管理 部门信息管理 会议管理 计划管理 行程安排管理 行程进度管理 管理员管理 开发环境和技术 开发语言&#xff1a;Java 使用框架: SSM(Spring SpringMVC Mybaits)或SpringBoot 前端…

数字万用表 (Digital Multimeter)

数字万用表 [Digital Multimeter] 1. Product parameters2. 交流频率测量3. 面板介绍4. 背光屏References 1. Product parameters 2. 交流频率测量 在交流 750V 档处按 HOLD 键切换到市电频率 3. 面板介绍 4. 背光屏 ​ References [1] Yongqiang Cheng, https://yongqiang…

【打工日常】使用Docker部署团队协作文档工具

一、ShowDoc介绍 ​ShowDoc是一个适合IT团队共同协作API文档、技术文档的工具。通过showdoc&#xff0c;可以方便地使用markdown语法来书写出API文档、数据字典文档、技术文档、在线excel文档等等。 响应式网页设计&#xff1a;可将项目文档分享到电脑或移动设备查看。同时也可…

easyExcel 导入、导出Excel 封装公共的方法

文档包含三部分功能 1、easyExcel 公共导出list<对象>方法&#xff0c;可以自定义excel中第一行和样式 2、easyExcel 导入逻辑&#xff0c;结合spring Validator 验证导入数据是否符合规范 3、easyExcel 自定义导出 list<map> 、 list<对象> &#xff08;可…

【论文阅读】IRNet:具有像素间关系的实例分割的弱监督学习

【论文阅读】IRNet:具有像素间关系的实例分割的弱监督学习 文章目录 【论文阅读】IRNet:具有像素间关系的实例分割的弱监督学习一、介绍二、联系工作三、方法四、实验结果 Weakly Supervised Learning of Instance Segmentation with Inter-pixel Relations 本文提出了一种以图…

2024043期传足14场胜负前瞻

2024043期售止时间为3月17日&#xff08;周日&#xff09;21点30分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率1场&#xff0c;1.5-2.0赔率7场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等偏上。以下为基础盘前瞻&#xff0c;大家可根据…

Java后端面试经验分享,~纯分享

本文将从面试、工作、学习三个方面分享最近面试的一些心得以及以后发展的一些规划&#xff0c;仅供参考&#xff0c;哈哈&#xff0c;毕竟本人也很菜&#xff0c;因为菜才要多学习。一会儿也会分享两本Java面试题库&#xff08;题库是b站大学找的&#xff0c;一会儿我也会分享出…

[Vue]组件间通讯

Vue组件间通讯 父子间通讯 非父子间通讯 父子间通讯 父组件通过 props 将数据传递给子组件父向子传值步骤 给子组件以添加属性的方式传值 子组件内部通过props接收 模板中直接使用 props接收 子组件利用 $emit 通知父组件修改更新 $emit触发事件&#xff0c;给父组件…

leetcode代码记录(组合

目录 1. 题目&#xff1a;2. 我的代码&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 4, k 2 输出&#xff1a; [ […

python知识点总结(一)

这里写目录标题 一、什么是WSGI,uwsgi,uWSGI1、WSGI2、uWSGI3、uwsgi 二、python中为什么没有函数重载&#xff1f;三、Python中如何跨模块共享全局变量?四、内存泄露是什么?如何避免?五、谈谈lambda函数作用?六、写一个函数实现字符串反转&#xff0c;尽可能写出你知道的所…

【Linux C | 多线程编程】线程的基础知识

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

MySQL语法分类 DQL(1)基础查询

//语法 select 字段列表 from 表名列表 where条件列表 group by分组字段 having 分组后的条件 order by排序 limit 分页限定为了更好的学习这里给出基本表数据用于查询操作 create table student (id int, name varchar(20), age int, sex varchar(5),address varchar(100),ma…

Go语言加密技术实战:掌握encoding/pem库

Go语言加密技术实战&#xff1a;掌握encoding/pem库 引言PEM格式简介核心组成常见用途 Go语言的encoding/pem库概览核心功能使用场景 开始使用encoding/pem读取PEM文件编码为PEM格式 深入理解PEM编码自定义PEM头部信息 使用encoding/pem解码PEM文件PEM文件的加密与解密加密私钥…

代码随想录训练营Day25:● 216.组合总和III ● 17.电话号码的字母组合

216.组合总和III 题目链接 https://leetcode.cn/problems/combination-sum-iii/description/ 题目描述 思路 自己写的效率会慢一些&#xff0c;而且没有用到剪枝 class Solution {List<List<Integer>> list new ArrayList<>();List<Integer> lis…

基于PIESDK的二次开发--土壤水反演系统

目录 系统演示数据获取算法封装系统 系统演示 数据获取 基于TVDI的土壤水分反演需要有地表温度和植被指数数据&#xff0c;该部分参考Landsat计算TVDI进行干旱监测&#xff08;二&#xff09; 得到两张TIF影像 算法封装 初始的.py代码参数是直接指定的&#xff0c;然而在封…

【Javascript编程实操06】1、反转数组和字符串 2、将二维数组转一维数组

前言 1、反转数组和字符串 代码&#xff1a; 实现效果&#xff1a; 2、将二维数组转一维数组 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串与数组的实操练习&#xff0c;共有2个实操&#xff0c;大家可以在实操的过程中更加深…

ARM 寄存器学习:(一)arm多种模式下得寄存器

一.ARM7种状态以及每种状态的寄存器&#xff1a; ARM 处理器共有 7 种不同的处理器模式&#xff0c;在每一种处理器模式中可见的寄存器包括 15 个通用寄存器( R0~R14)、一个或两个(User和Sys不是异常模式&#xff0c;没有spsr寄存器)状态寄存器&#xff08;cpsr和spsr&…

想兼职赚钱?盘点6个靠谱兼职,赚钱更轻松!

1&#xff0c;微头条搬砖 微头条搬砖是一个门槛不高的赚钱方式&#xff0c;而且不需要你有多么好的原创能力&#xff0c;去收集一些热门文章的素材进行文章伪原创&#xff0c;十分钟就能搞定&#xff0c;只要你的文章有爆点&#xff0c;足够吸人眼球&#xff0c;就能够获取不低…

Web核心,HTTP,tomcat,Servlet

1&#xff0c;JavaWeb技术栈 B/S架构:Browser/Server&#xff0c;浏览器/服务器架构模式&#xff0c;它的特点是&#xff0c;客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器&#xff0c;获取Web资源&#xff0c;服务器把Web资源…