LeetCode:Binary Tree Level Order Traversal
2015-10-11 20:51
477 查看
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree
return its level order traversal as:
My Solution
最开始看到是二叉树的层次遍历,想用队列做。后来发现还要分层,所以只能用二维数组了。
想法还是很自然的,逐层生成即可。
难度并不大,只是指针用得比较多。二维变长数组就要两次解引用,如果元素还是指针的话,三个*看起来容易晕。
再有就是对int **columnSizes参数的使用,尤其是*和[]的优先级问题,[]是比*高的。所以先解引用再用下标的时候,一定要用括号把*括起来。如:(*columnSizes)[index]
For example:
Given binary tree
{3,9,20,#,#,15,7},
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
My Solution
最开始看到是二叉树的层次遍历,想用队列做。后来发现还要分层,所以只能用二维数组了。
想法还是很自然的,逐层生成即可。
/** * 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 *columnSizes array. * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free(). */ int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) { if(!root) { *columnSizes = NULL; *returnSize = 0; return NULL; } *returnSize = maxDepth(root); // 树的高度 // 分配内存 struct TreeNode* ** traversalNode = (struct TreeNode* **)malloc(*returnSize * sizeof(struct TreeNode* *)); int **traversalVal = (int**)malloc(*returnSize * sizeof(int*)); *columnSizes = (int*)malloc(*returnSize * sizeof(int)); // 先计算第一层(根节点) traversalNode[0] = (struct TreeNode**)malloc(1 * sizeof(struct TreeNode*)); traversalVal[0] = (int*)malloc(1 * sizeof(int)); traversalNode[0][0] = root; traversalVal[0][0] = root->val; (*columnSizes)[0] = 1; // 逐层计算 for(int height = 1; height < *returnSize; ++height) { // 分配内存 traversalNode[height] = (struct TreeNode**)malloc(2 * (*columnSizes)[height - 1] * sizeof(struct TreeNode*)); traversalVal[height] = (int*)malloc(2 * (*columnSizes)[height - 1] * sizeof(int)); // 根据上一层,计算当前层的节点指针与数据 int index = 0; for(int lastIndex = 0; lastIndex < (*columnSizes)[height - 1]; ++lastIndex) { if(traversalNode[height - 1][lastIndex]->left) { traversalNode[height][index] = traversalNode[height - 1][lastIndex]->left; traversalVal[height][index] = traversalNode[height - 1][lastIndex]->left->val; ++index; } if(traversalNode[height - 1][lastIndex]->right) { traversalNode[height][index] = traversalNode[height - 1][lastIndex]->right; traversalVal[height][index] = traversalNode[height - 1][lastIndex]->right->val; ++index; } } // 确定当前层的columnSize (*columnSizes)[height] = index; // 释放上一层的节点空间 free(traversalNode[height - 1]); } free(traversalNode); return traversalVal; } int maxDepth(struct TreeNode *root) { if(!root) { return 0; } int leftDepth = maxDepth(root->left) + 1; int rightDepth = maxDepth(root->right) + 1; return leftDepth > rightDepth ? leftDepth : rightDepth; }
难度并不大,只是指针用得比较多。二维变长数组就要两次解引用,如果元素还是指针的话,三个*看起来容易晕。
再有就是对int **columnSizes参数的使用,尤其是*和[]的优先级问题,[]是比*高的。所以先解引用再用下标的时候,一定要用括号把*括起来。如:(*columnSizes)[index]
相关文章推荐
- 避免僵死进程
- 数据结构: 二叉查找树(BST)
- Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
- [置顶] MySQL建库建表和修改表结构
- MCS-51单片机的存储器组织结构
- ocp-306
- 进程与线程的区别
- coredata swift 简单入门
- Trie树(单词查找树)
- 第二次练习——团队展示
- C# 属性、索引
- Android学习手记(5) 基本UI布局
- SQL中 decode()函数简介
- 例10-12 *uva1637(概率dp)
- Scala 入门介绍
- hdu 2571
- 例10-12 *uva1637(概率dp)
- Linux 如何打开端口
- 海量数据挖掘MMDS week3:社交网络之社区检测:高级技巧
- Quatre 2D的绘图功能的三个步骤(上下文,绘图,渲染)