【PTA数据结构 | C语言版】列出叶结点

发布于:2025-07-18 ⋅ 阅读:(21) ⋅ 点赞:(0)

本专栏持续输出数据结构题目集,欢迎订阅。

文章目录

题目

对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶结点。

输入格式:
首先第一行给出一个正整数 n(≤10),为树中结点总数。树中的结点从 0 到 n−1 编号。随后 n 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。

输出格式:
在一行中按规定顺序输出叶结点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6

输出样例:
4 1 5

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_N 10

typedef struct TreeNode {
    int left;
    int right;
} TreeNode;

int main() {
    int n;
    scanf("%d", &n);
    getchar(); // 消耗换行符

    TreeNode nodes[MAX_N];
    int isRoot[MAX_N];
    memset(isRoot, 1, sizeof(isRoot)); // 初始化所有节点为根候选

    // 读取输入并构建树
    for (int i = 0; i < n; i++) {
        char left[2], right[2];
        scanf("%s %s", left, right);

        // 处理左子节点
        if (left[0] == '-') {
            nodes[i].left = -1;
        } else {
            nodes[i].left = atoi(left);
            isRoot[nodes[i].left] = 0; // 该节点有父节点,不可能是根
        }

        // 处理右子节点
        if (right[0] == '-') {
            nodes[i].right = -1;
        } else {
            nodes[i].right = atoi(right);
            isRoot[nodes[i].right] = 0; // 该节点有父节点,不可能是根
        }
    }

    // 确定根节点
    int root = -1;
    for (int i = 0; i < n; i++) {
        if (isRoot[i]) {
            root = i;
            break;
        }
    }

    // 层序遍历队列
    int queue[MAX_N];
    int front = 0, rear = 0;
    queue[rear++] = root;

    int leaves[MAX_N];
    int leafCount = 0;

    // 层序遍历
    while (front < rear) {
        int current = queue[front++];
        // 如果是叶节点
        if (nodes[current].left == -1 && nodes[current].right == -1) {
            leaves[leafCount++] = current;
        }
        // 将子节点加入队列
        if (nodes[current].left != -1) {
            queue[rear++] = nodes[current].left;
        }
        if (nodes[current].right != -1) {
            queue[rear++] = nodes[current].right;
        }
    }

    // 输出结果
    for (int i = 0; i < leafCount; i++) {
        printf("%d", leaves[i]);
        if (i < leafCount - 1) {
            printf(" ");
        }
    }
    printf("\n");

    return 0;
}    

网站公告

今日签到

点亮在社区的每一天
去签到