【发布时间】: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