給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問全部節點)。數據結構
例如: 給定二叉樹: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其層次遍歷結果: [ [3], [9,20], [15,7] ]
層次遍歷實際上就是使用廣度優先遍歷(BFS)從root開始遍歷。咱們學數據結構的時候知道,BFS通常用隊列做輔助,DFS通常用棧進行輔助。
因此在這一題咱們使用隊列輔助進行廣度優先遍歷。每次pop一個元素,就判斷其有無左右孩子,如有則將孩子加進隊列。code
這一題的一個難點是,如何區分層次,使不一樣層次的數在不一樣的行上?
遇到這種狀況咱們通常用一個標記值,而這題的隊列存儲的是地址。因此咱們將NULL設爲這個標記值。
做用是:每當一個層次的數所有pop()後,緊隨其後的就是NULL。也就是在隊列中用NULL把各個層次分開。
咱們首先初始的時候在root後加一個NULL。以後的過程當中每讀到一個NULL就push一個新的NULL。隊列
class Solution { public: vector<vector<int>> levelOrder(TreeNode *root) { if (root == NULL) return {}; vector<vector<int>> ans; queue<TreeNode *> temp; temp.push(root); temp.push(NULL); vector<int> cur_vec; while(!temp.empty()){ TreeNode *t = temp.front(); temp.pop(); if(t==NULL){ ans.push_back(cur_vec); cur_vec.resize(0); if(temp.size()>0){ temp.push(NULL); } }else{ cur_vec.push_back(t->val); if(t->left) temp.push(t->left); if(t->right) temp.push(t->right); } } return ans; } };