LeetCode 102. Binary Tree Level Order Traversal 103二叉树分层Z字形遍历

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]

思路:

方法1:(层次遍历、BFS)与普通层次遍历稍微不一样的地方就是,需要分出每一层的结点数据来。

如果提前知道每一层数据的个数len,那么只需要循环len次即可取出这一层的数据。那么刚好保持队列内一直为同一层的数据即可。

(两种在vector<vector<int>> ans 添加元素的方法)


class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        //vector<int> anstmp;
        if(root==NULL) return ans;
        queue<TreeNode*> q;
        int index=0;
        q.push(root);
        int len=0;
        while(!q.empty())
        {
            len=q.size();
            ans.push_back(vector<int>());
            for(int i=0;i<len;i++)
            {
                TreeNode* now=q.front();
                //anstmp.push_back(now->val);
                ans[index].push_back(now->val);
                q.pop();
                if(now->left) q.push(now->left);
                if(now->right) q.push(now->right);
            }
           //ans.push_back(anstmp); 
           //anstmp.clear();
            index++;
        }
        return ans;
        
    }
};
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> anstmp;
        if(root==NULL) return ans;
        queue<TreeNode*> q;
        //int index=0;
        q.push(root);
        int len=0;
        while(!q.empty())
        {
            len=q.size();
            for(int i=0;i<len;i++)
            {
                TreeNode* now=q.front();
                anstmp.push_back(now->val);
                //ans[index].push_back(now->val);
                q.pop();
                if(now->left) q.push(now->left);
                if(now->right) q.push(now->right);
            }
           ans.push_back(anstmp); 
           anstmp.clear();
            //index++;
        }
        return ans;
        
    }
};


方法2:dfs利用树深度添加结果,每次到下一层depth+1

class Solution {
public:
    
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        if(root==NULL) return ans;
        dfs(ans,root,0);
        return ans;
    } 
    void dfs(vector<vector<int>> &ans,TreeNode* root ,int depth)
    {
        if(root==NULL) return ;
        if(ans.size()==depth) ans.push_back(vector<int>());
        ans[depth].push_back(root->val);
        if(root->left) dfs(ans,root->left,depth+1);
        if(root->right) dfs(ans,root->right,depth+1);
    }
};


103 Binary Tree Zigzag Level Order Traversal(二叉树分层Z字形遍历)

方法1:index%2!=0,reverse(anstmp.rbegin(),anstmp.rend())

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> anstmp;
        if(root==NULL) return ans;
        queue<TreeNode*> q;
        int index=0;
        q.push(root);
        int len=0;
        while(!q.empty())
        {
            len=q.size();
            for(int i=0;i<len;i++)
            {
                TreeNode* now=q.front();
                anstmp.push_back(now->val);
                //ans[index].push_back(now->val);
                q.pop();
                if(now->left) q.push(now->left);
                if(now->right) q.push(now->right);
            }
         if(index%2!=0)  reverse(anstmp.rbegin(),anstmp.rend()); 
          ans.push_back(anstmp);
           anstmp.clear();
           index++;
        }
        return ans;
        
    }
};

方法2:用两个 stack 表示当前s,和下一个nexts,利用栈的先进后出的原则。有一个区别是这里我们需要一层一层的来处理(原来可以按队列插入就可以,因为后进来的元素不会先处理),所以会同时维护新旧两个栈,一个来读取,一个存储下一层结点。总体来说还是一次遍历完成,所以时间复杂度是O(n),空间复杂度最坏是两层的结点,所以数量级还是O(n)(满二叉树最后一层的结点是n/2个)。

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> ans;
        vector<int> anstmp;
        if(root==NULL) return ans;
        stack<TreeNode*> s;
        stack<TreeNode*> nexts;
        
        stack<TreeNode*> tmp;
        int index=0;
        s.push(root);
        int len=0;
        while(!s.empty())
        {
            len=s.size();
            for(int i=0;i<len;i++)
            {
                TreeNode* now=s.top();
                anstmp.push_back(now->val);
                //ans[index].push_back(now->val);
                s.pop();
                if(index%2==0)
                {               
                    if(now->left) nexts.push(now->left);
                    if(now->right) nexts.push(now->right);
                }
                else
                {
                    if(now->right) nexts.push(now->right); 
                    if(now->left) nexts.push(now->left);
                }
                
            }
         //if(index%2!=0)  reverse(anstmp.rbegin(),anstmp.rend()); 
           ans.push_back(anstmp);
           anstmp.clear();
           tmp=nexts;
           nexts=s;
           s=tmp;
           index++;
        }
        return ans;
        
    }
};

猜你喜欢

转载自blog.csdn.net/momo_mo520/article/details/80401803