题目描述
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解法1:递归
最简单的解法就是递归,首先确认树非空,然后调用递归函数 helper(node, level),参数是当前节点和节点的层次。程序过程如下:
输出列表称为 levels,当前最高层数就是列表的长度 len(levels)。比较访问节点所在的层次 level 和当前最高层次 len(levels) 的大小,如果前者更大就向 levels 添加一个空列表。
将当前节点插入到对应层的列表 levels[level] 中。
递归非空的孩子节点:helper(node.left / node.right, level + 1)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { private: vector<int> temp; vector<vector<int>> res; public: vector<vector<int>> levelOrder(TreeNode* root) { levelfind(root,0); return res; } void levelfind(TreeNode *root,int height) { if(root!=NULL) { if(height>=res.size()) res.push_back(temp); res[height].push_back(root->val); levelfind(root->left,height+1); levelfind(root->right,height+1); } } };
|
解法2:迭代
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| class Solution { private: vector<vector<int>> res; public: vector<vector<int>> levelOrder(TreeNode* root) { if(root==NULL) return res; queue<TreeNode *>q; TreeNode *p; q.push(root); while(!q.empty()) { vector<int> temp; int n=q.size(); for(int i=0;i<n;i++) { p=q.front(); temp.push_back(p->val); q.pop(); if(p->left!=NULL) q.push(p->left); if(p->right!=NULL) q.push(p->right); } res.push_back(temp); } return res; } };
|