Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).node
For example:
Given binary tree{3,9,20,#,#,15,7}
,spa3 / \ 9 20 / \ 15 7
return its level order traversal as:code
[ [3], [9,20], [15,7] ]
這道題目是二叉樹的層次遍歷。blog
思路:藉助於隊列結構(queue),保存還沒有訪問兒子節點的節點。隊列
這道題一大注意點在於,每層結束後插入NULL做爲分隔符。it
1. 初始化:將根節點和第一層終止符NULL壓入隊列io
2. 循環class
用level記錄該層的節點valtest
- 取出隊首元素cursed
- 若cur非空, 記錄cur->val
若cur爲NULL,則說明該層節點已所有訪問過,將level插入ret.
若此時queue非空,訪問下一層節點,不然,中止循環
代碼
1 /** 2 * Definition for binary tree 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>> levelOrder(TreeNode *root) { 13 // IMPORTANT: Please reset any member data you declared, as 14 // the same Solution instance will be reused for each test case. 15 vector<vector<int>> ret; 16 if(root==NULL) 17 return ret; 18 19 queue<TreeNode *> q; 20 q.push(root); 21 q.push(NULL); // IMPORTANT! end of level 22 23 vector<int> level; 24 25 while(!q.empty()) 26 { 27 TreeNode *cur = q.front(); 28 q.pop(); 29 30 if(cur) 31 { 32 level.push_back(cur->val); 33 if(cur->left) 34 q.push(cur->left); 35 if(cur->right) 36 q.push(cur->right); 37 } 38 else 39 { 40 ret.push_back(level); 41 level.clear(); 42 if(q.empty()) 43 break; 44 else 45 q.push(NULL); 46 } 47 } 48 return ret; 49 } 50 };