[Leetcode]102.二叉樹的層次遍歷

題目

給定一個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問全部節點)。數據結構

例如:
給定二叉樹: [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;
    }
};
相關文章
相關標籤/搜索