二维数组元素输出

0

环境:VS2019 C语言

问题:根据传入函数的参数和返回值输出二维数组内的所有元素的方法。

程序目的:实现二叉树的层序遍历

函数如下:

int** LevelOrder(struct TreeNode *root,int *returnSize,int** returnColumnSizes){
	*returnSize = 0;
	if (root == NULL) {
		return NULL;
	}
	int** res =(int**)malloc(sizeof(int*) * 1000);
	*returnColumnSizes =(int*)malloc(sizeof(int)*1000);
	if (!res || !*returnColumnSizes)
		return NULL;
	struct TreeNode* queue[1000];
	int front = -1, rear = -1;
	queue[++rear] = root;
	while (rear != front) {
		(*returnColumnSizes)[*returnSize] = rear - front;
		res[*returnSize] =(int*)malloc(sizeof(int)*(rear-front));
		if (res[*returnSize] == NULL) return NULL;
		for (int i = 0, j = front + 1; i < rear - front;i++,j++){
			res[*returnSize][i] = queue[j]->val;
		}
		(*returnSize)++;
		int tmp = rear;
		for (int i = front + 1; i <= tmp;i++) {
			if (queue[i]->left) {
				queue[++rear] = queue[i]->left;
			}
			if (queue[i]->right) {
				queue[++rear] = queue[i]->right;
			}
		}
		front = tmp;
	}
	return res;
}
#include<malloc.h>
#include<stdio.h>
typedef struct TreeNode {
	int val;
	struct TreeNode* left;
	struct TreeNode* right;
}BiTnode;
void CreateBiTree(BiTnode** root) {
	if (*root == NULL) return;
	int value = -1;
	scanf_s("%d", &value);
	if (value == -1) {
		*root = NULL;
	}
	else {
		*root =(BiTnode*)malloc(sizeof(BiTnode));
		if (*root == NULL) return;
		(*root)->val = value;
		printf("左子树:\n");
		CreateBiTree(&(*root)->left);
		printf("右子树:\n");
		CreateBiTree(&(*root)->right);
	}
}
int** LevelOrder(struct TreeNode *root,int *returnSize,int** returnColumnSizes){
	*returnSize = 0;
	if (root == NULL) {
		return NULL;
	}
	/***
	*returnSize返回输出的数目
    **returnColumnSizes每层的结点数
	***/
	int** res =(int**)malloc(sizeof(int*) * 1000);
	*returnColumnSizes =(int*)malloc(sizeof(int)*1000);
	if (!res || !*returnColumnSizes)
		return NULL;
	struct TreeNode* queue[1000];
	int front = -1, rear = -1;
	queue[++rear] = root;
	while (rear != front) {
		/***
		当前层的结点数
		***/
		(*returnColumnSizes)[*returnSize] = rear - front;
		res[*returnSize] =(int*)malloc(sizeof(int)*(rear-front));
		if (res[*returnSize] == NULL) return NULL;
		for (int i = 0, j = front + 1; i < rear - front;i++,j++){
			/***
			把这一层的节点值放入结果数组中
			***/
			res[*returnSize][i] = queue[j]->val;
		}
		(*returnSize)++;
		int tmp = rear;
		for (int i = front + 1; i <= tmp;i++) {
			if (queue[i]->left) {
				queue[++rear] = queue[i]->left;
			}
			if (queue[i]->right) {
				queue[++rear] = queue[i]->right;
			}
		}
		front = tmp;
	}
	return res;
}
int main() {
	BiTnode *root;
	int returnSize;
	int* returnColumnSize;
	int** res;
	CreateBiTree(&root);
	res=LevelOrder(root, &returnSize, &returnColumnSize);
	for (int i = 0; i < returnSize; i++) {
		printf("%d ", res[returnSize]);
	}
	return 0;
}
ava
凤栖梧

2020-12-1

0

我实在想不明白二叉树层序遍历和二维数组有什么关系。

ava
慢羊羊

2020-12-1

这个是力扣的题解我想搭建实现这个方法的环境,方便调试观察自己想观察的参数变化,了解一下这个平台方法怎么实现的。 -  凤栖梧  2020-12-1
@凤栖梧 包括你的回复,我表示听不懂。 -  慢羊羊  2020-12-1
@慢羊羊 这个是力扣某个问题的解决方法,,单纯的直接提交不能直观的了解这个方法在整个程序是怎么实现,或者说用完整的程序运行这个方法更好的了解这个方法传入的各项的参数的作用,同时自己可以通过调试这个方法了解到自己想了解的参数变化,进一步更深刻的理解这个方法,,这个是我老师建议的做法同时我自己也是这么认为的。因为有时自己可以在平台运行这个方法,但是整个程序自己不一定能完整写出并且在编译器内正确调用而没有其他的问题。当然,大佬这些知识点比较熟悉,运行结构当然了然于胸,觉得多此一举,但是对我初学者而言,这是了解一个知识点必不可少的步骤,能在程序内调用整个函数才算真的理解这个方法。 -  凤栖梧  2020-12-2
@慢羊羊 如果不用程序调用这个方法,那么这个方法始终只是存在于这平台中,自己如果需要使用这个方法的知识点时可能会有意想不到的错误,到时需要手忙脚乱的处理,,我不一定在每一个场合都有足够时间处理,比如某场比较重要考试使用这个方法遇到一些情况。 -  凤栖梧  2020-12-2
@慢羊羊 我贴一下我完整程序实现,,但是输出部分还是有问题,这里是需要解决的。 -  凤栖梧  2020-12-2
技术讨论社区