曾经沧海难为水,除却巫山不是云。|

Joey-Wang

园龄:4年3个月粉丝:17关注:0

9.3 树的遍历

9.3 树的遍历

http://codeup.hustoj.com/contest.php?cid=100000612

A 树查找

image-20200826010850612

题目解析

这道题指明树是完全二叉树,依次输入结点。

对完全二叉树当中的任何一个结点(设编号为x),其左孩子的编号是2x,右孩子编号是2x+1
❗根结点必须从1开始!!!(否则2*0=0)

所以大体解题思路:
1️⃣ 使用Node[maxn] 数组存储树的结点,对当前下标为x的结点,可通过下标2x访问其左孩子,2x+1访问其右孩子
2️⃣ 输入的是结点的data,需要记录层次,所以node结构体中有成员data、layer
3️⃣ 使用BFS遍历整棵树,存储d层次的结点
(之所以存储下来而不是直接输出,因为土题目要求节点间用空格隔开,最后一个节点后没有空格)
4️⃣ 输出存储的d层次的结点

代码

#include <cstdio>
#include <queue>

#define maxn 1005
using namespace std;
struct node {
    int data;
    int layer;
} Node[maxn];
int n, d; //结点个数,深度
int ans[maxn], digit;

void BFS(int root) {
    queue<int> q;
    Node[root].layer = 1;
    q.push(root);
    while (!q.empty()) {
        int front = q.front();
        if (Node[front].layer == d) {
            ans[digit++] = Node[front].data;
        }
        q.pop();
        //左孩子存在
        if (2 * front <= n) {
            Node[2 * front].layer = Node[front].layer + 1;
            q.push(2 * front);
        }
        if (2 * front + 1 <= n) {
            Node[2 * front + 1].layer = Node[front].layer + 1;
            q.push(2 * front + 1);
        }
    }
}

int main() {
    while (scanf("%d", &n) && n!=0) {
        for (int i = 1; i <= n; i++) {
            scanf("%d", &Node[i].data);
        }
        scanf("%d", &d);
        digit = 0;
        BFS(1);
        if (digit == 0) printf("EMPTY\n");
        else {
            for (int i = 0; i < digit; i++) {
                printf("%d", ans[i]);
                if (i < digit - 1) printf(" ");
                else printf("\n");
            }
        }
    }
    return 0;
}

B 树的高度

image-20200826011655470

题目解析

这道题考察的是普通树的遍历,用数组存储树的所有结点

因为输入的是树各个结点之间的关系,所以node结构体不用存储data。因为要输出树的高度,所以要记录layer
(用vector<int> child存储此结点所有的孩子结点)

⚠️ 唯一要注意一点:
一开始没有用ans在BFS过程中记录最大的结点layer,认为Node[n].layer一定最大,直接在main中输出Node[n].layer,结果WA。(🙃maybe 结点不一定按照层数顺序编号,可能会有大的结点在较低高度的情况)

代码

#include <cstdio>
#include <vector>
#include <queue>

#define maxn 105  //随便写的大小,题目没说,但是AC了
using namespace std;
struct node {
    int layer;
    vector<int> child;
} Node[maxn];
int n, ans;

void BFS(int root) {
    queue<int> q;
    Node[root].layer = 1;
    q.push(root);
    while (!q.empty()) {
        int front = q.front();
        q.pop();
        if (Node[front].layer > ans) ans = Node[front].layer;  //!!重要
        for (int i = 0; i < Node[front].child.size(); i++) {
            int child = Node[front].child[i];
            Node[child].layer = Node[front].layer + 1;
            q.push(child);
        }
    }
}

int main() {
    int a, b;
    while (scanf("%d", &n) != EOF) {
        for (int i = 0; i < n - 1; i++) {
            scanf("%d%d", &a, &b);
            Node[a].child.push_back(b);
        }
        ans = 0;
        BFS(1);
        printf("%d\n", ans);
    }
    return 0;
}

本文作者:Joey-Wang

本文链接:https://www.cnblogs.com/joey-wang/p/14541182.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   Joey-Wang  阅读(54)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
展开