leetcode Binary Tree Level Order Traversal
给定一个数,广度优先输出记录。例如:
Given binary tree {3,9,20,#,#,15,7}
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
思考了一下,居然被我想到了用队列来存储每一层的数据。嘿嘿。
用两个队列,一个队列用来输出,一个队列用来记录下一层的所有左右节点,然后循环使用两个队列即可。
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { vector<vector<int> > ans; if (!root) return ans; vector<int> tmp; TreeNode *lf, *ri, *p; queue<TreeNode *> q1, q2; q1.push(root); while(!q1.empty() || !q2.empty()) { while(!q1.empty()) { p = q1.front(); q1.pop(); tmp.push_back(p -> val); if (p -> left) q2.push(p -> left); if (p -> right) q2.push(p -> right); } ans.push_back(tmp); tmp.clear(); if (q1.empty() && q2.empty()) return ans; // q1完,判断是否都为空 while(!q2.empty()) { p = q2.front(); q2.pop(); tmp.push_back(p -> val); if (p -> left) q1.push(p -> left); if (p -> right) q1.push(p -> right); } ans.push_back(tmp); tmp.clear(); } return ans; } };
一开始使用两个flag标记,来判断是否进入了中间的两个while是否进入,用来判断是否要pushback。后面发现只要在上面注释部分判断是否都为空就行。
当然,我用到了两个队列。可不可以只用一个呢。
用一个队列的话就是用NULL来判断分层。每次完后输入一个NULL。例如:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<vector<int> > levelOrder(TreeNode *root) { // IMPORTANT: Please reset any member data you declared, as // the same Solution instance will be reused for each test case. vector<vector<int> >res; if(root == NULL)return res; queue<TreeNode*> myqueue; myqueue.push(root); myqueue.push(NULL);//NULL是层与层之间间隔标志 vector<int> level; while(myqueue.empty() == false) { TreeNode *p = myqueue.front(); myqueue.pop(); if(p != NULL) { level.push_back(p->val); if(p->left)myqueue.push(p->left); if(p->right)myqueue.push(p->right); } else { res.push_back(level); if(myqueue.empty() == false) { level.clear(); myqueue.push(NULL); } } } return res; } };