SWUST OJ#978 #979 #980 二叉树的遍历
目录
深度优先遍历
输出利用先序遍历创建的二叉树的前序遍历序列
思路
代码
#978 输出利用先序遍历创建的二叉树的中序遍历序列
题目
思路
代码
#979 输出利用先序遍历创建的二叉树的后序遍历序列
题目
思路
代码
广度优先遍历
#980 输出利用先序遍历创建的二叉树的层次遍历序列
题目
思路
代码
深度优先遍历
输出利用先序遍历创建的二叉树的前序遍历序列
思路
按照前序遍历定义:根->左子树->右子树,写出代码即可。
代码
//前序遍历
void BTProOrder(BinaryTree* &root) {if(root==NULL) return;cout<<root->data<<" ";BTProOrder(root->left);BTProOrder(root->right);
}
#978 输出利用先序遍历创建的二叉树的中序遍历序列
题目
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树的中序遍历序列。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树的中序遍历序列。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
对应的二叉树的中序遍历序列。
样例输入
A## ABC#### AB##C## ABCD###EF##G### A##B##样例输出
A CBA BAC DCBFEGA A
思路
按照中序遍历定义:左子树->根->右子树,写出代码即可。
//中序遍历
void BTInOrder(BinaryTree* &root) {if(root==NULL) return;BTInOrder(root->left);cout<<root->data<<" ";BTPostOrder(root->right);
}
代码
二叉树模板,二叉树介绍
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
typedef long long ll;
using namespace std;
// 定义二叉树
typedef struct BTNode{char data;BTNode* left;BTNode* right;
}BinaryTree;
//创建二叉树
void BTCreate(BinaryTree* &root) {BTNode *q;q=new BTNode;cin>>q->data;root=q;if(q->data=='#') {root=q=NULL;return;}BTCreate(root->left);BTCreate(root->right);return;
}
//中序遍历
void BTInOrder(BinaryTree* &root) {if(root==NULL) return;BTInOrder(root->left);cout<<root->data;BTInOrder(root->right);
}
int main() {BinaryTree* root;BTCreate(root);BTInOrder(root);return 0;
}
#979 输出利用先序遍历创建的二叉树的后序遍历序列
题目
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树的后序遍历序列。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树的后序遍历序列。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
对应的二叉树的后序遍历序列。
样例输入
A## ABC#### AB##C## ABCD###EF##G### A##B##样例输出
A CBA BCA DCFGEBA A
思路
按照后序遍历定义:左子树->右子树->根,写出代码即可
//后序遍历
void BTPostOrder(BinaryTree* &root) {if(root==NULL) return;BTPostOrder(root->left);BTPostOrder(root->right);cout<<root->data<<" ";
}
代码
二叉树模板,二叉树介绍
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
typedef long long ll;
using namespace std;
// 定义二叉树
typedef struct BTNode{char data;BTNode* left;BTNode* right;
}BinaryTree;
//创建二叉树
void BTCreate(BinaryTree* &root) {BTNode *q;q=new BTNode;cin>>q->data;root=q;if(q->data=='#') {root=q=NULL;return;}BTCreate(root->left);BTCreate(root->right);return;
}
//后序遍历
void BTPostOrder(BinaryTree* &root) {if(root==NULL) return;BTPostOrder(root->left);BTPostOrder(root->right);cout<<root->data;
}
int main() {BinaryTree* root;BTCreate(root);BTPostOrder(root);return 0;
}
广度优先遍历
#980 输出利用先序遍历创建的二叉树的层次遍历序列
题目
题目描述
利用先序递归遍历算法创建二叉树并输出该二叉树的层次遍历序列。先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树的二叉链表存储结构。约定二叉树结点数据为单个大写英文字符。当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点。最后再输出创建完成的二叉树的层次遍历序列。需要注意输入数据序列中的"#"字符和非"#"字符的序列及个数关系,这会最终决定创建的二叉树的形态。
输入
输入为接受键盘输入的由大写英文字符和"#"字符构成的一个字符串(用于创建对应的二叉树)。
输出
每个用例用一行出该用例对应的二叉树的层次遍历序列。
样例输入
A## ABC#### AB##C## ABCD###EF##G##H## A##B##样例输出
A ABC ABC ABHCEDFG A
思路
#内容纯属虚构,如有雷同,纯属巧合#
这是某一天周末的凌晨6点,宿舍外楼下空无一人,起风了,窗外的树叶沙沙作响。小詹从睡梦中惊醒,想着周末放松一下,于是打开《王者荣耀》,此时,屏幕上居然浮空亮出一行字:该应用已被加密,请输入密码。小詹这下是完全睡不着了,他连忙起床,回想着昨天好像没有设置密码吧?他左想想,右想想。突然,手机上又冒出一行字:密码就是.....
小詹直接震惊,心想:这不是在做梦吧???他掐了掐自己:“woc好疼,这居然不是在做梦!!”
是什么让小詹这么震惊?原理手机上冒出的字是:密码就是swust oj#978 #979 #980的答案,输入代码成功AC即可解锁。
小詹迫不得已,打开电脑,打开swust oj。“ 看到题目。emmm二叉树的遍历?这么简单?这不有手就行?”,很快啊,小詹立马把#978 #979 AC了,可是当他看到#980的时候,“ 寄!层序遍历是个什么东西?”,他突然意识到,羊儿这不是前几天才AC了吗,要不登登他的号,偷偷代码?然而oj炸了,羊儿的号却始终登不进去。窗外的风更大了,树叶摇的更响了,仿佛在说:“不会吧,不会吧,这年头居然有人还不会层序遍历?”
小詹这就跑到羊儿的宿舍,把羊儿从睡梦中摇醒。厚脸皮的说到:“呀,羊儿起床了呀,快告诉我,那个层序遍历是个啥玩意?”,羊儿一脸疑惑看着小詹:“你啥时候这么勤快,居然来a题了?”小詹不得已,掏出手机,打开《王者荣耀》,羊儿看到了,满脸疑惑。小詹连忙说:别疑惑了,快告诉我怎么AC。
“行行行,晚上要请我水果捞啊 ”。小詹很不情愿的点了点头。羊儿随手一画,画出了一颗二叉树。
“你看,层序遍历,就是这样,从第一层,从左往右依次输出,这样就叫层序遍历。”
小詹似懂非懂,“那既然原理知道了,那么代码怎么打呢?”
“你少给我装,你还打不来代码?”
“好像,喔,我知道了,同时输出左右孩子不就行了吗?”
void BTLevelOrder(BinaryTree* &root) {if(root==NULL) return;if(root->left!=NULL) cout<<root->left->data;if(root->right!=NULL) cout<<root->right->data;BTLevelOrder(root->left);BTLevelOrder(root->right);
}
羊儿皱了皱眉头:“你这个前面还可以,后面不就变成先序遍历了吗?这样的话就是ABHCEDFGI了呀。你这样只能保证每层前三个是有序的呀”
小詹想了想,好像是这样的,但是小詹还是想不出代码了。羊儿忍不住:“我给你个提示,想想之前是怎么求二叉树最大宽度的?”
“二叉树宽度?emmmm”
“对啊,之前在求最大宽度的时候,不就是函数参数多加了个第几层嘛,然后新开了一个数组,储存该层有多少个节点。”
“喔,我懂了!! 那我用char定义一个二维数组a,储存每一层节点的data。然后用int定义一个一位数组b,储存每一层有多少个节点,然后遍历输出二维数组a就行”
//遍历
char a[105][105];//a[i][j]表示第i层第j个节点
int b[105];//b[i]表示第i层有多少个节点
void BTLevelOrder(BinaryTree* &root,int level) {if(root==NULL) return;b[level]++;a[level][b[level]]=root->data;BTLevelOrder(root->left,level+1);BTLevelOrder(root->right,level+1);return;
}
//输出
void BTPrint() {for(int i=1;b[i]!=0;i++) {for(int j=1;j<=b[i];j++) {cout<<a[i][j];}}
}
小詹写出代码,提交:AC。“这下终于可以耍《王者荣耀》了。”然而,羊儿却拦住了小詹,“等会儿,你这样可是可以AC,但是空间复杂度会不会太大了点?甚至还用了二维数组”
小詹想了想:“太大了点?那你这个不是二维的,怎么表示层数?”
“你不会只知道数组只储存 char 和 int 吧?”
小詹不屑的看着羊儿:“废话,不还有long long吗?”
羊儿也满脸不屑的看着小詹。“欸,可以新建一个储存二叉树节点的数组! ”
BTNode* a[105];
羊儿又把刚才画的图拿了出来
“你看啊,先把根节点插入到数组中,作为a[1],然后再插入a[1]的左右孩子作为a[2],a[3],然后再插入a[2]的左右孩子作为a[4],a[5],然后继续,插入a[3]的孩子节点作为a[6].....,你看,这样不就达到了层序遍历,还是一位数组储存的呀,最后依次输出数组每个节点的data不就完了嘛”
小詹连忙说出:“妙啊妙啊”,接着打出了代码。
BTNode* a[105];
void BTLevelOrder(BinaryTree* &root) {int i=1,j=1;a[i++]=root;while(j<i) {cout<<a[j]->data;if(a[j]->left!=NULL) a[i++]=a[j]->left;if(a[j]->right!=NULL) a[i++]=a[j]->right;j++; }return;
}
羊儿又拦住了小詹,“ 要是我出题阴间一点,数据出的特别特别大,你这不久又爆内存了嘛 ”
小詹惊讶道:“还能再减?”
“那可不,你看你 i 和 j 一直在增加,前面的数据都没用了,那留着干嘛,占内存吗?能不能用完就删?”
小詹恍然大悟,拨云见日,茅厕顿开(啊不是,茅塞顿开):“懂了,01数组是吧?”
“为啥一定要数组?用stl的队列啊,用完就pop出队列,这不挺香的嘛”
“啊对对对”,接着小詹用STL打出了代码。
//层序遍历
void BTLevelOrder(BinaryTree* &root) {queue<BTNode*>Q; //建立一个存放二叉树节点的队列Q.push(root);BTNode *q;while(!Q.empty()) {cout<<Q.front()->data;q=Q.front();Q.pop();if(q->left!=NULL) Q.push(q->left);if(q->right!=NULL) Q.push(q->right);}
}
于是小詹又一次提交,又AC了, 他掏出手机,打开《王者荣耀》,输入代码,终于,密码解开了,小詹立马回到寝室点开了一把排位。完全不给羊儿再次拦住的机会。
那么问题来了,密码是怎么来的呢......
代码
二叉树模板,二叉树介绍
#include <bits/stdc++.h>
using namespace std;
//定义
typedef struct BTNode {char data;BTNode *left;BTNode *right;
}BinaryTree;
//创建二叉树
void Create(BinaryTree* &root) {BTNode *q;q=new BTNode;cin>>q->data;if(q->data=='#') {root=q=NULL;return;}root=q;Create(root->left);Create(root->right);
}
//层序遍历
void BTLevelOrder(BinaryTree* &root) {queue<BTNode*>Q;Q.push(root);BTNode *q;while(!Q.empty()) {cout<<Q.front()->data;q=Q.front();Q.pop();if(q->left!=NULL) Q.push(q->left);if(q->right!=NULL) Q.push(q->right);}
}
int main() {BinaryTree *root;Create(root);BTLevelOrder(root);return 0;
}
SWUST OJ#978 #979 #980 二叉树的遍历相关推荐
- SWUST OJ 978: 输出利用先序遍历创建的二叉树的中序遍历序列
题目描述 利用先序递归遍历算法创建二叉树并输出该二叉树的中序遍历序列.先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建 ...
- swust oj 978 利用先序遍历创建二叉树的中序遍历
#include<iostream> using namespace std; typedef struct BTNode{char data;BTNode *l,*r; }BT; //创 ...
- SWUST OJ#1052 输出利用先序遍历创建的二叉树中的指定结点的双亲结点
目录 题目 思路 代码 题目 题目描述 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点.约定二叉树结点数据为单个大写英文字符.当接收的数据是字符"#"时表示该结点 ...
- SWUST OJ 971: 统计利用先序遍历创建的二叉树的深度
题目描述 利用先序递归遍历算法创建二叉树并计算该二叉树的深度.先序递归遍历建立二叉树的方法为:按照先序递归遍历的思想将对二叉树结点的抽象访问具体化为根据接收的数据决定是否产生该结点从而实现创建该二叉树 ...
- SWUST OJ 1051: 输出利用先序遍历创建的二叉树中的指定结点的子结点
先吐槽一下"孩子"居然是禁止使用的词汇?!我说"孩子节点都不行"嘛 题目描述 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的儿子结点.约定二叉树结点数 ...
- SWUST OJ 1052: 输出利用先序遍历创建的二叉树中的指定结点的双亲结点
题目描述 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的双亲结点.约定二叉树结点数据为单个大写英文字符.当接收的数据是字符"#"时表示该结点不需要创建,否则创建该结点.最 ...
- SWUST OJ 1053: 输出利用先序遍历创建的二叉树中的指定结点的度
水了三题一摸一样的题目,好快乐 题目描述 利用先序递归遍历算法创建二叉树并输出该二叉树中指定结点的度.约定二叉树结点数据为单个大写英文字符.当接收的数据是字符"#"时表示该结点不需 ...
- SWUST OJ#971 #972 返回二叉树宽度和深度
目录 #971 统计利用先序遍历创建的二叉树的深度 题目 思路 代码 #972 统计利用先序遍历创建的二叉树的宽度 题目 思路 代码 #971 统计利用先序遍历创建的二叉树的深度 题目 题目描述 利 ...
- SWUSTOJ #978 输出利用先序遍历创建的二叉树的中序遍历序列
SWUSTOJ #978 输出利用先序遍历创建的二叉树的中序遍历序列 题目 输入 输出 样例输入 样例输出 源代码 题目 利用先序递归遍历算法创建二叉树并输出该二叉树的中序遍历序列.先序递归遍历建立二 ...
最新文章
- SVG Authoring Guidelines[转]
- 【Express】—路由配置
- 20210224:力扣第229周周赛
- Hibernate怎么提升数据库查询的性能 (1)
- java面向对象_谈谈Java的面向对象
- Javascript中for循环别名
- unable to remove repository reference (must force) - container is using its referenced image
- 计算机网络谢希仁第七版课后答案完整版
- 彻底搞懂Android文件存储---内部存储,外部存储以及各种存储路径解惑
- 堆排序算法——C/C++
- 2022年8月Python小屋编程比赛获奖名单(送5本书)
- “扣哒杯” AI世青赛公布2021-2022年度全国决赛个人获奖名单
- 第一次做腌菜 腌柚子皮
- nginx php多域名配置文件,配置文件,nginx_nginx多站点配置,无法通过域名访问,使用ip访问会跳转到其中一个站点,配置文件,nginx - phpStudy...
- Php扫码签到功能怎么实现,扫码签到常用方法_云分组小程序
- 恰星V3S投影仪好不好?适合学生党购入么?
- 微信小程序开发之——Video
- R语言一种无偏变量选择的多元统计方法
- 如何上手机上不了无线网络连接服务器,手机连接不上路由器无线网络怎么处理...
- 基于STM32风速风向检测仿真
热门文章
- 计算机word中的宏,Word用宏来更改文档样式-word技巧-电脑技巧收藏家
- 雷 · 阿伦:给13岁自己的一封信
- 扬帆优配|再迎利好,券商板块发力走高,东方证券、首创证券拉升
- Promiscuous Mode
- 那些年和我一起睡的男人
- 咖啡店banner.html
- 出现报错ModuleNotFoundError: No module named ‘serial’ 解决方法
- php 识别图片五星好评,基于jquery实现五星好评
- Vue 顶部栏滚动控制显隐和文字字体闪光动画效果随笔
- 企业财务管理为何需要数字化转型?