解题思路:

注意事项:

参考代码:

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

typedef struct node {
    int data;                       // 数据域
    struct node *father;            // 父结点指针
    struct node *left, *right;      // 左右孩子结点指针
} Node;

// 创建一个结点
Node *createNode(int data) {
    Node *node = (Node *) malloc(sizeof(Node));
    node->father = NULL;
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 递归中序遍历树结点
void inorderTransversal(Node *node) {
    if (node == NULL) {
        return;
    }

    inorderTransversal(node->left);
    printf("%d ", node->data);
    inorderTransversal(node->right);
}

int main() {
    int n;
    scanf("%d", &n);

    // 存放树中所有结点的数组
    Node *nodes[n + 1];
    for (int i = 0; i < n + 1; i++) {
        nodes[i] = NULL;
    }

    int li, ri;
    for (int i = 1; i <= n; i++) {
        // 当前的第i个结点为空
        if (nodes[i] == NULL) {
            nodes[i] = createNode(i);
        }

        scanf("%d %d", &li, &ri);

        // 左结点不是0,且为空
        if (li != 0 && nodes[li] == NULL) {
            nodes[li] = createNode(li);
            nodes[li]->father = nodes[i];           // 设置父结点指针,方便往上查找根节点
        }

        // 右结点不是0,且为空
        if (ri != 0 && nodes[ri] == NULL) {
            nodes[ri] = createNode(ri);
            nodes[ri]->father = nodes[i];
        }

        // 设置当前结点的左右孩子结点
        nodes[i]->left = nodes[li];
        nodes[i]->right = nodes[ri];
    }

    // 获取二叉树中任一结点,找到树的根节点
    Node *root = nodes[1];
    while (root->father != NULL) {
        root = root->father;
    }

    // 递归中序遍历
    inorderTransversal(root);

    // 释放树中所有结点
    for (int i = 0; i < n + 1; i++) {
        free(nodes[i]);
    }
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论