標籤:des style blog http color strong
題目:
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 {3,9,20,#,#,15,7},
3 / 9 20 / 15 7
return its level order traversal as:
[ [3], [9,20], [15,7]]
confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
說明:
1)層序遍曆,每層單獨輸出,順序:從上到下,從左至右(思考:從下到上,從右至左如何?下面會說明)
2)實現也分遞迴和迭代,其中迭代貼出了兩種實現(思想基本相同)
實現:
一、遞迴實現
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 vector<vector<int>> result;14 traverse(root,1,result);15 return result;16 }17 void traverse(TreeNode *root,size_t level,vector<vector<int>> &result)18 {19 if(root==nullptr) return;20 if(level>result.size()) result.push_back(vector<int>());21 result[level-1].push_back(root->val);22 traverse(root->left,level+1,result);23 traverse(root->right,level+1,result);24 }25 };
二、迭代實現
a 迭代實現1
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 /*常規層序遍曆思想,每層入隊結束壓入一個空節點,作為標誌*/11 class Solution {12 public:13 vector<vector<int> > levelOrder(TreeNode *root) {14 vector<vector<int>> vec_vec_tree;//建立空vector,存放最後返回的遍曆二叉樹的值15 vector<int> level;//建立空的vector,存放每一層的遍曆二叉樹的值16 TreeNode *p=root;17 if(p==nullptr) return vec_vec_tree;//如果二叉樹空,返回空vector<vector<int>> 18 queue<TreeNode *> queue_tree;//建立一個空隊列19 queue_tree.push(p);//root節點入隊列20 queue_tree.push(nullptr);//空節點入隊列21 while(!queue_tree.empty())//直到隊列為空白22 {23 p=queue_tree.front(); //頭結點取值,並出隊列24 queue_tree.pop();25 if(p==nullptr&&!level.empty())//節點為空白並且隊列不為空白26 {27 queue_tree.push(nullptr);//入隊空節點,與下一層隔開28 vec_vec_tree.push_back(level);//已遍曆的層入隊29 level.clear();//清空vecor level30 }31 else if(p!=nullptr)//如果節點不空32 {33 level.push_back(p->val);//遍曆34 if(p->left) queue_tree.push(p->left);//若有左右孩子,則入隊列35 if(p->right) queue_tree.push(p->right);//注意入隊順序:先左後右36 }37 38 }39 return vec_vec_tree;40 }41 };
b 迭代實現2
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 /*兩個隊列實現*/11 class Solution {12 public:13 vector<vector<int> > levelOrder(TreeNode *root) {14 vector<vector<int> > result;15 if(root == nullptr) return result;16 queue<TreeNode*> current, next;//兩個隊列,儲存當層(current)和下層(next)節點17 vector<int> level; // 存放每層的節點值18 current.push(root);19 while (!current.empty())//直到二叉樹遍曆完成20 {21 while (!current.empty())//直到本層二叉樹遍曆完成22 {23 TreeNode* node = current.front();//取隊首節點,出隊列24 current.pop();25 level.push_back(node->val);//訪問節點值26 if (node->left != nullptr) next.push(node->left);//若存在左右節點,則壓入next隊列中27 if (node->right != nullptr) next.push(node->right);//注意入隊順序為先left後right28 }29 result.push_back(level);//壓入總vector30 level.clear();//清vector31 swap(next, current);//next隊列和current隊列交換32 }33 return result;34 }35 };
最後說明:如果 從下到上,從右至左如何遍曆,如何?
我的想法:從下到上,直接把結果vector<vector<int>>逆序即可
從右至左,把入隊順序改為先右後左即可