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

AdamWong發表於2019-02-27

題目

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

例如:
給定二叉樹: [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回其層次遍歷結果:

[
  [3],
  [9,20],
  [15,7]
]

思路

層次遍歷實際上就是使用廣度優先遍歷(BFS)從root開始遍歷。我們學資料結構的時候知道,BFS一般用佇列作輔助,DFS一般用棧進行輔助。
所以在這一題我們使用佇列輔助進行廣度優先遍歷。每次pop一個元素,就判斷其有無左右孩子,若有則將孩子加進佇列。

這一題的一個難點是,如何區分層次,使不同層次的數在不同的行上?
遇到這種情況我們一般用一個標記值,而這題的佇列儲存的是地址。所以我們將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;
    }
};

相關文章