题解 | #按之字形顺序打印二叉树#

按之字形顺序打印二叉树

http://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0

C语言解题思路

  1. 本质上还是层序遍历输出二叉树
  2. 在层序遍历二叉树中,构建队列顺序存储每一层
  3. 设置深度标识k,奇偶深度存储的方向相反。

重点来了!返回值一直没有搞懂,从代码中可以看要返回一个int **类型的指针,也就是按照每一层进行返回。需要使用malloc初始化一个最多1500层的int*类型的数组。接下来在每一层遍历的时候,需要根据该层的叶子个数继续初始化malloc int类型空间。这样就解决了返回值的问题。接下来是*returnSize,这个变量用于记录行数,也就是二叉树层数。最后就是int **returnColumnSizes参数,记录每一层的节点个数。和返回值类似,第一步初始化1500层。第二步记录每一层的个数。

 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pRoot TreeNode类 
 * @return int整型二维数组
 * @return int* returnSize 返回数组行数
 * @return int** returnColumnSizes 返回数组列数
 */
int** Print(struct TreeNode* pRoot, int* returnSize, int** returnColumnSizes ) {
    if (pRoot == NULL)
		return NULL;
	int pre = 0, end = 0,k=1,tempend=0,a=1;
	int** nums=(int **)malloc(sizeof(int *)*1500);
	*returnColumnSizes = (int*)malloc(sizeof(int) * 1500);
	int tempnum = 0;
	struct TreeNode* Nodes[1000] ;
	Nodes[end++] = pRoot;
	//只要队列不为空
	nums[0] = (int*)malloc(sizeof(int));
	nums[0][0] = pRoot->val;
	*returnSize = 0;
	*returnColumnSizes[0] =1;
	while (Nodes[pre]) {
		k++;
		tempend = end;
		//一个循环一层
		for (; pre < tempend; pre++) {
			if (Nodes[pre]->left != NULL)
				Nodes[end++] = Nodes[pre]->left;
			if (Nodes[pre]->right != NULL)
				Nodes[end++] = Nodes[pre]->right;

		}
		tempnum= end - tempend;
		if (pre == end)
			break;
		//returnColumnSizes[k-1] = (int*)malloc(sizeof(int));
		(* returnColumnSizes)[k - 1] = tempnum;
		nums[k - 1] = (int*)malloc(sizeof(int) * tempnum);
		//偶数层,从右往左输出
		if (k % 2 == 0) {
			int j = 0;
			for (int i = end; i > tempend; i--) {
				nums[k - 1][j++]= Nodes[i - 1]->val;
			}
			(* returnColumnSizes)[k - 1] = j;
				
		}
		//奇数层,从左往右输出
		else {
			int j = 0;
			for (int i = tempend; i < end; i++)
				nums[k - 1][j++] = Nodes[i]->val;
			(* returnColumnSizes)[k - 1] = j;
		}
	}
	k--;
	*returnSize = k;
	return nums;
}
全部评论

相关推荐

Jing_Rainb...:小公司搞出大厂流程,要么是真缺技术大牛,要么是老板的偶像包袱😂…面完记得来更新后续!
点赞 评论 收藏
分享
程序员小白条:这简历除了学历确实没啥亮点,先找个中小厂再说吧
点赞 评论 收藏
分享
10-13 22:56
门头沟学院 C++
rt,鼠鼠的浪潮网签明天过期,鼠鼠是山东人,好像自己也能接受。之前的面试大厂基本挂干净了,剩下小米二面后在泡,问了下面试官没有挂,但要泡。还有海信似乎也通过了,不过在深圳,鼠鼠也不是很想去。其它还有一些公司应该陆陆续续还有一些面试,现在有些纠结是直接签了还是再等再面呢?大佬们能不能给鼠鼠提一些意见,万分感谢!!!
牛客78696106...:浪潮可不是开摆,当初我还是开发的时候我组长跟我说他们组有段时间天天1,2点走,早上5点就来,全组肝出来心肌炎,浪潮挣钱省立花可不是说说,当然也看部门,但是浪潮普遍就那dio样,而且你算下时薪就知道不高,没事也是9点半走,不然算你旷工
投递小米集团等公司10个岗位
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务