二叉树层次遍历相关题目

102. 二叉树的层次遍历

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(root==nullptr)
            return res;
        
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int n = que.size(); //记录当前层元素的个数
            vector<int> level;
            for(int i=0;i<n;i++){
                TreeNode* tmp = que.front();
                que.pop();
                level.push_back(tmp->val);
                if(tmp->left)
                    que.push(tmp->left);
                if(tmp->right)
                    que.push(tmp->right);
            }
            res.push_back(level);
            
        }
        return res;
    }
};

  

107. 二叉树的层次遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

方法一:使用队列,每次遍历一层后,将遍历的结果使用头插法。插入到二维数组的头部,实现逆序。

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> res;
        if(root==nullptr)
            return res;
        
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            int n = que.size();
            vector<int> level;
            for(int i=0;i<n;i++){
                TreeNode* tmp = que.front();
                que.pop();
                level.push_back(tmp->val);
                if(tmp->left)
                    que.push(tmp->left);
                if(tmp->right)
                    que.push(tmp->right);
            }
            res.insert(res.begin(),level);
            
        }
        return res;
    }
};  

执行16ms

方法二 使用递归方法(通过递归实现逆序)

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> res;
        if(root==nullptr)
            return res;
        queue<TreeNode*> que;
        que.push(root);
        levelOrderBottom(que, res);
        return res;
        
    }
    void levelOrderBottom(queue<TreeNode*> que,vector<vector<int>>& res){
        if(que.empty())
            return;
        vector<int> arr;
        queue<TreeNode*> queNext; //用于存储下一层的结点
        while(!que.empty()){  //将当前层存储在arr中,并将下一层结点存储在queNext中。然后递归,最后在将arr数组push进res中
            TreeNode* tmp = que.front();
            que.pop();
            arr.push_back(tmp->val);
            if(tmp->left)
                queNext.push(tmp->left);
            if(tmp->right)
                queNext.push(tmp->right);    
        }
        
        levelOrderBottom(queNext, res);
        res.push_back(arr);
        return;
    }
};

  

 

103. 二叉树的锯齿形层次遍历(之字形遍历)

方法一:使用两个栈

两个stack各自保存一层数据,然后先进后出的特性加上左右节点先后入栈的顺序细节(具体谁先谁后可以看代码)即可恰好对应zigZag的Z字形访问顺序:

右往左时右先入栈,左往右时,左先入栈。
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(root==nullptr)
            return res;
        
        stack<TreeNode*> sta1,sta2;
        vector<int> arr;
        TreeNode* tmp = root;
        sta1.push(tmp);
        while(true){
            while(!sta1.empty()){
                tmp = sta1.top();
                sta1.pop();
                arr.push_back(tmp->val);
                if(tmp->left)
                    sta2.push(tmp->left);
                if(tmp->right)
                    sta2.push(tmp->right);
            }
            if(!arr.empty()){
                res.push_back(arr);
                arr.clear();  //一定要清零
            }      
            else
                break;
            
            while(!sta2.empty()){
                tmp = sta2.top();
                sta2.pop();
                arr.push_back(tmp->val);
                if(tmp->right)
                    sta1.push(tmp->right);
                if(tmp->left)
                    sta1.push(tmp->left);
                
            }
            if(!arr.empty()){
                res.push_back(arr);
                arr.clear();  //一定要清零
            }
            else
                break;
        }
        return res;
    }
};

  

 

posted @ 2019-10-19 21:57  GuoXinxin  阅读(375)  评论(0编辑  收藏  举报