力扣第102题(二叉树的层序遍历<C语言>)

 题目:

 

层序遍历其实不难,这题难的地方就是:

        1、要自己开二维数组空间,malloc了int**的变量作为返回数组以后还要malloc   int* (每一行的一维数组也要malloc).

        2、要理解returnSize和returnColumnSizes的意思,因为后台不知道我们给的二维数组的行数和列数,所以就要我们给这个行数和列数。returnSize就是行数returnColumnSizes就是每一行的列数所构成的数列,因为需要我们在函数里面改变returnSize这个数字,所以传了int*, 因为需要我们在函数里面改变returnColumnSizes这个数组,所以传了int**

下面就给出代码: 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */

 int max(int x, int y)
 {
	 return x>y?x:y;
 }

typedef struct TreeNode* Queuedatatype;
typedef struct QueueNode {
	Queuedatatype data;
	struct QueueNode* next;
}QNode;
 
typedef struct Queue {
	QNode* head;
	QNode* tail;
}Queue;
 
QNode* BuyNewnode(Queuedatatype x)
{
	QNode* newnode = (QNode*)malloc(sizeof(QNode));
	if (newnode == NULL) {
		printf("malloc fail");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}
 
void QueuePush(Queue* pq, Queuedatatype x)//尾入
{
	assert(pq);
	QNode* newnode = BuyNewnode(x);
	if (pq->head == NULL) {
 
		pq->head = pq->tail = newnode;
	}
	else {
		pq->tail->next = newnode;
		pq->tail = newnode;
	}
}
 
void QueuePop(Queue* pq)//头删
{
	assert(pq);
	assert(pq->head);
	if (pq->head->next == NULL) { pq->tail = NULL; }//防止tail野指针或者在(2)处
	QNode* next = pq->head->next;
	free(pq->head);
	pq->head = next;
	//if (pq->head == NULL) { pq->tail = NULL; }(2)
}
 
bool QueueEmpty(Queue* pq)
{
	assert(pq);
 
	return pq->head == NULL;
}
 
Queuedatatype QueueFront(Queue* pq)//头出
{
	assert(pq);
	assert(!QueueEmpty(pq));
 
	return pq->head->data;
}
 
Queuedatatype QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
 
	return pq->tail->data;
}
 
int QueueSize(Queue* pq)
{
	int n = 0;
	QNode* cur = pq->head;
	while (cur)
	{
		cur = cur->next;
		n++;
	}
	return n;
}
 
void QueueInit(Queue* pq)//初始化
{
	assert(pq);
	pq->head = pq->tail = NULL;
}
 
void QueueDestroy(Queue* pq)//销毁
{
	assert(pq);
	QNode* cur = pq->head;
	while (cur)
	{
		QNode* next = cur->next;
		free(cur);
		cur = next;
	}
	pq->head = pq->tail = NULL;
}

int treeKLevel(struct TreeNode* root, int k)//第K层的结点个数
{
	assert(k >= 1);
	if (root == NULL)
		return 0;
	/*if (root != NULL && k == 1)
		return 1;*/
	if (k == 1)//root一定不为空
		return 1;
	return treeKLevel(root->left, k - 1) + treeKLevel(root->right, k - 1);
}

int treeDepth(struct TreeNode* root)//层数
{
	if (root == NULL)
		return 0;
	if (root->left == NULL && root->right == NULL)
	{
		return 1;
	}
	else
	{
		return max(treeDepth(root->left), treeDepth(root->right)) + 1;
	}
}

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
		//这里的returnSize是要返回的数组的行数
		//returnColumnSizes是要返回数组的列数所组成的一个数组
    *returnSize = 0;//如果树为空,要返回*returnSize为0
    if(root == NULL)
        return root;
    int* num1 = (int*)malloc(sizeof(int) * 2000);//存储树的所有数据
    int level = treeDepth(root);//二叉树层数
    *returnSize = level;//二叉树的层数就是要返回的二维数组的行数
	*returnColumnSizes = (int*)malloc(sizeof(int) * (*returnSize));//malloc一个数组存放每行的列数
		int** num2 = (int**)malloc(sizeof(int*) * (*returnSize));//准备返回的二维数组
    for(int i = 0; i < level; i++)
    {
        (*returnColumnSizes)[i] = treeKLevel(root, i+1);//二叉树每层的数目就是二维数组每行的列数,存放在returnColumnSizes中
    }
    Queue q;//基本思想:借助队列实现层序遍历
    QueueInit(&q);
    QueuePush(&q, root);
    int j = 0;
    while(!QueueEmpty(&q))
    {
        struct TreeNode* cur = QueueFront(&q);
        num1[j++] = cur->val;//将二叉树的元素按照层序遍历存在num1中
        QueuePop(&q);
        if(cur->left)
        {
            QueuePush(&q, cur->left);
        }
        if(cur->right)
        {
            QueuePush(&q, cur->right);
        }
    }
    int k = 0;
    for(int i = 0; i < level; i++)
    {
			num2[i] = (int*)malloc(sizeof(int) * (*returnColumnSizes)[i]);
			//num2只开了(int**)的,要形成二维数组还要开(int*)的
      for(int j = 0; j<(*returnColumnSizes)[i];j++)
      {
			num2[i][j] = num1[k++];//每层存入数据
      }
    }
	free(num1);//free掉num1
    return num2;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值