中序遍历 - C 语言中将节点数据添加到 Int 数组

Posted

技术标签:

【中文标题】中序遍历 - C 语言中将节点数据添加到 Int 数组【英文标题】:Inorder Traversal - Add Node Data to Int Array in C Langauge 【发布时间】:2021-12-17 08:08:06 【问题描述】:

我正在用 C 语言实现中序遍历算法,下面是我的代码。我的任务是在 nodeDataList 中添加每个节点的数据。然而,nodeDataList 存储的是奇怪的数据,

void inorder(Node* N, int* nodeDataList, int index)
   if(N != NULL)
       inorder(N->left, nodeDataList, index);
       printf("%d: %d ", index, N->data);
       nodeDataList[index++] = N->data;
       inorder(N->right, nodeDataList, index);
   

下面是main函数中的设置,

struct Node root = 27, NULL, NULL;
struct Node root_left = 26, NULL, NULL;
struct Node root_right = 39, NULL, NULL;
struct Node root_right_right = 48, NULL, NULL;
struct Node root_right_left = 40, NULL, NULL;
struct Node *N;
struct Node *N_left;
struct Node *N_right;
struct Node *N_right_right;
struct Node *N_right_left;
N = &root;
N_left = &root_left;
N_right = &root_right;
N_right_right = &root_right_right;
N_right_left = &root_right_left;

N_right->right = N_right_right;
N_right->left = N_right_left;

N->left = N_left;
N->right = N_right;
int result = 5;

int nodeDataList[result];
int index = 0;

inorder(N, nodeDataList, index);
printf("\n");

printf("%d\n", nodeDataList[0]);
printf("%d\n", nodeDataList[1]);
printf("%d\n", nodeDataList[2]);
printf("%d\n", nodeDataList[3]);
printf("%d\n", nodeDataList[4]);

运行代码时,我得到以下数据,

0: 26 0: 27 1: 40 1: 39 2: 48 
27
39
48
-1427448988
-1086203488

我不确定 -1427448988 和 -1086203488 是什么。我已经正确创建了顺序,但是 int 数组在索引 3 和 4 处生成了不正确的数据。

【问题讨论】:

第一行输出清楚地表明index 不是必需的。多次调用的值相同,永远不会达到 3 和 4。 【参考方案1】:

您在传递最后一个参数index 时遇到问题。按值传递它不会在后续调用之间保留其值。

试试这个:

#include <stdio.h>

struct Node

    int data;
    struct Node *left;
    struct Node *right;
;
typedef struct Node Node;

void inorder(Node* N, int* nodeDataList, int *index)
   if(N != NULL)
       inorder(N->left, nodeDataList, index);
       printf("%d: %d ", *index, N->data);
       nodeDataList[(*index)++] = N->data;
       inorder(N->right, nodeDataList, index);
   




int main(void)
    struct Node root = 27, NULL, NULL;
    struct Node root_left = 26, NULL, NULL;
    struct Node root_right = 39, NULL, NULL;
    struct Node root_right_right = 48, NULL, NULL;
    struct Node root_right_left = 40, NULL, NULL;
    struct Node *N;
    struct Node *N_left;
    struct Node *N_right;
    struct Node *N_right_right;
    struct Node *N_right_left;
    N = &root;
    N_left = &root_left;
    N_right = &root_right;
    N_right_right = &root_right_right;
    N_right_left = &root_right_left;

    N_right->right = N_right_right;
    N_right->left = N_right_left;

    N->left = N_left;
    N->right = N_right;
    int result = 5;

    int nodeDataList[result];
    int index = 0;

    inorder(N, nodeDataList, &index);
    printf("\n");

    printf("%d\n", nodeDataList[0]);
    printf("%d\n", nodeDataList[1]);
    printf("%d\n", nodeDataList[2]);
    printf("%d\n", nodeDataList[3]);
    printf("%d\n", nodeDataList[4]);

``

【讨论】:

以上是关于中序遍历 - C 语言中将节点数据添加到 Int 数组的主要内容,如果未能解决你的问题,请参考以下文章

数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树

数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树

数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树

数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树

数据结构(C语言版)严蔚敏->二叉树(链式存储结构)的构造及其几种遍历方式(先序中序后序层次)和线索二叉树

五分钟C语言数据结构 之 二叉树后序遍历(非递归很重要)