Adam's blog
Published by Adam

[Leetcode]102.二叉树的层次遍历

题目

给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。

例如:
给定二叉树: [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;
    }
};
posted @ 2019-02-27 22:27  AdamWong  阅读(222)  评论(0编辑  收藏  举报