【问题标题】:create an array with the values of the nodes at a level使用某个级别的节点值创建一个数组
【发布时间】:2017-08-06 14:34:14
【问题描述】:

我必须创建一个数组,其中包含作为参数传递的级别中的节点值。函数createArray 必须返回一个数组,其中包含作为参数传递的级别的节点值。我的代码是:

#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>

struct node {
    int data;
    struct node* left;
    struct node* right;
};

struct node* newNode(int data) {
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = NULL;
    node->right = NULL;

    return node;
}

int numNodesLevel(struct node* root, int level) {
    if (root == NULL) {
        return 0;
    }
    else {
        if (level == 0) {
            return 1;
        }
        return numNodesLevel(root->left, level - 1) + numNodesLevel(root->right, level - 1);
    }
}

int max(int a, int b) {
    if(a > b) {
        return a;
    }
    else {
        return b;
    }
}

int height(struct node* root) {
    if (root == NULL) {
        return -1;
    }
    else {
        if (root->left == NULL && root->right == NULL) {
            return 0;
        }
        return max(height(root->left), height(root->right)) + 1;
    }
}

int maxNodesLevel(struct node* root) {
    if (root == NULL) {
        return 0;
    }
    else {
        int max = 0;
        int h = height(root);
        int i = 0;
        for (i = 0; i <= h; i++) {
            if (numNodesLevel(root, i) > max) {
                max = numNodesLevel(root, i);
            }
        }
        return max;
    }
}

void fill(struct node* root, int* A, int level, int* i) {
    if (root != NULL) {
        if (level == 0) {
            A[*i] = root->data;
            *i = *i + 1;
        }
        fill(root->left, A, level - 1, i);
        fill(root->right, A, level - 1, i);
    }
}

int* createArray(struct node* root, int level) {
    if (root != NULL) {
        int *A = (int*)calloc(maxNodesLevel(root), sizeof(int));
        int i = 0;
        fill(root, A, level, &i);
        return A;
    }
}

int main(){
    struct node* root = newNode(12);
    root->left = newNode(3);
    root->right = newNode(16);
    root->left->left = newNode(2);
    root->left->right = newNode(2);
    root->right->left = newNode(2);
    root->right->right = newNode(22);
    printf("%d", createArray(root,1));
    getchar();
    return 0;
}

结果应该是 3,16,这是 1 级节点的值,但它给了我不同的数字,比如 22721648。每次运行代码时这些数字都不一样,所以我认为肯定有问题我使用指针的方式,但我不知道错误在哪里。 有人可以帮帮我吗?

【问题讨论】:

  • createRoot 返回什么?你想打印什么?你将如何打印任何其他数组?
  • printf("%d", createArray(root,1)); : createArray 返回int *,而不是int
  • 您是否尝试过仅打印树以确保树正确,然后再开始执行其他操作?您不能通过对printf() 的一次调用来打印数组,因此最后的输出被破坏了——出于多种原因,但所有这些都表明必须完全重写printf() 行(并且它将停止是一行;可能至少有一个变量声明和一个循环控制行和一个不同的printf())。
  • #includes 对于minimal reproducible example 来说是绝对必要的。

标签: c data-structures tree binary-tree


【解决方案1】:

代码是正确的,但这里唯一的错误是 createArray() 返回一个数组并且您将其视为 int。 添加以下代码而不是 printf() 即可。

int level = 1, *arr;
arr = createArray(root, level);
for(int i = 0; i < 2 * level; i++){
    printf("%d ", arr[i]);
}

希望对你有帮助!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多