Noob


私信TA

用户名:529013515

访问量:6839

签 名:

等  级
排  名 403
经  验 4886
参赛次数 0
文章发表 27
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

注意事项:

参考代码:

#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分

3 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区