[力扣c语言实现]107. 二叉树的层序遍历 II

107. 二叉树的层序遍历 II

1. 题目描述

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如:
给定二叉树 [3,9,20,null,null,15,7],

3

/
9 20
/
15 7
返回其自底向上的层序遍历为:

[
[15,7],
[9,20],
[3]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2.代码如下


int getlevelval(struct TreeNode* root,int cur_level,int **level_array,int *array_size)
{
    
    
	if (root)
	{
    
    
		level_array[cur_level] = realloc(level_array[cur_level],sizeof(int)*(array_size[cur_level]+1));
		level_array[cur_level][array_size[cur_level]] = root->val;
		array_size[cur_level] += 1;
		
		if (root->left)
		{
    
    
			getlevelval(root->left,cur_level+1,level_array,array_size);
		}
		
		if (root->right)
		{
    
    
			getlevelval(root->right,cur_level+1,level_array,array_size);
		}
	}
	
	return 0;
}

int **rever_2arr(int **g,int *colsize,int **newcolsize,int array_size)
{
    
    
	int i = 0,j = 0;
	int *tmp = NULL;
	int *new_colsize = NULL;
	int **new_array = NULL;
	new_array = (int **)malloc(sizeof(int *)*array_size);
	memset(new_array,0,sizeof(int *)*array_size);
	
	new_colsize = (int *)malloc(sizeof(int)*array_size);
	memset(new_colsize,0,sizeof(int)*array_size);
	
	for (i = array_size-1; i >=0;i--)
	{
    
    
		tmp = NULL;		
		if (colsize[i]!=0)
		{
    
    
			tmp = (int *)malloc(sizeof(int)*colsize[i]);
			memset(tmp,0,sizeof(int)*colsize[i]);
		}
		else 
		{
    
    
			break;
		}
		
		for (j = 0;j < colsize[i];j++)
		{
    
    
			tmp[j] = g[i][j];
		}
		new_colsize[array_size-1-i] = colsize[i];
		new_array[array_size-1-i] = tmp;
		free(g[i]);
	}
	
	free(g);
	*newcolsize = new_colsize;
	free(colsize);
	return new_array;
}

int** levelOrderBottom(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    
    
    int **level_array = NULL;
	int *array_size = NULL;
	int *new_array_size = NULL;
	int tree_dep = 0;
	
    if (root == NULL)
    {
    
    
		*returnSize = 0;
        return level_array;
    }

	tree_dep = 1000;//gettreedep(root);
	level_array = (int **)malloc(sizeof(int *)*tree_dep);
	memset(level_array,0,sizeof(int *)*tree_dep);
	
	array_size = (int *)malloc(sizeof(int)*tree_dep);
	memset(array_size,0,sizeof(int)*tree_dep);
	getlevelval(root,0,level_array,array_size);

	for (int i = 0;i < tree_dep;i++)
	{
    
    
		if (array_size[i] == 0)
		{
    
    
			break;
		}
	}
	
	tree_dep = i;
	
	//做一个逆序
	level_array = rever_2arr(level_array,array_size,&new_array_size,tree_dep);
	
    *returnSize = tree_dep;
    *returnColumnSizes = new_array_size;
	return level_array;
}

猜你喜欢

转载自blog.csdn.net/dengwodaer/article/details/114295566