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;
}

  • 18
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是孤衾呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值