103. Binary Tree Zigzag Level Order Traversal

Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).

For example:
Given binary tree {3,9,20,#,#,15,7},

    3
   / \
  9  20
    /  \
   15   7

return its zigzag level order traversal as:

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

这道题明显是要用广度优先算法来实现。

需要注意的是:

深度优先算法要用栈来实现,广度优先需要用队列来实现。

 

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
struct Node{
    TreeNode* node;
    int level;
    Node(){};
    Node(TreeNode* root,int lev):node(root),level(lev){};
};
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        vector<int> tempRes;
        if(root==NULL)
            return res;
        queue<Node> Que;
        Que.push(Node(root,0));
        int curLevel=0;
        while(!Que.empty())
        {
            Node front=Que.front();
            if(front.node->left!=NULL)
                Que.push(Node(front.node->left,front.level+1));
            if(front.node->right!=NULL)
                Que.push(Node(front.node->right,front.level+1));
            if(curLevel==front.level)
            {
                tempRes.push_back(front.node->val);
            }
            else
            {
                if(curLevel%2==1)
                    reverse(tempRes.begin(),tempRes.end());
                res.push_back(tempRes);
                tempRes.clear();
                curLevel=front.level;
                tempRes.push_back(front.node->val);
            }
            Que.pop();
        }
        if(curLevel%2==1)
                reverse(tempRes.begin(),tempRes.end());
        res.push_back(tempRes);
        tempRes.clear();
        return res;
        
    }
};

 

  网上看到另一种解法,没有定义结构体,设置一个标志来表明是从左往右还是从右往左。这里用的是一个枚举类型enum{L,R};每遍历一层,对方向进行一个转变。

/** 
 * Definition for binary tree 
 * struct TreeNode { 
 *     int val; 
 *     TreeNode *left; 
 *     TreeNode *right; 
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} 
 * }; 
 */  
class Solution {  
public:  
   vector<vector<int> > zigzagLevelOrder(TreeNode *root) {  
    vector<vector<int>>result;  
    if (!root)  
        return result;  
    vector<int>vec;  
    queue<TreeNode*>q1;  
    TreeNode *temp = root;  
    enum Dir{L,R};  
    Dir dir = L;  
    q1.push(root);  
      
    while (!q1.empty())  
    {  
        queue<TreeNode *>q2;  
        while (!q1.empty())  
        {  
            temp = q1.front();  
            q1.pop();  
            if (temp->left)  
                q2.push(temp->left);  
            if (temp->right)  
                q2.push(temp->right);  
            vec.push_back(temp->val);  
        }  
        if (dir == R)  
        {  
            reverse(vec.begin(), vec.end());  
            dir = L;  
        }  
        else  
            dir = R;  
        result.push_back(vec);  
        vec.clear();  
        q1 = q2;  
    }  
    return result;  
    }  
};  

 

 

3.自己实现的第三种方案,用两个栈来实现

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(nullptr == root)
        {
            return res;
        }

        stack<TreeNode*> leftStk;
        stack<TreeNode*> rightStk;
        leftStk.push(root);

        while(!leftStk.empty() || !rightStk.empty())
        {
            vector<int> left;
            while(!leftStk.empty())
            {
                TreeNode* leftNode =  leftStk.top();
                left.push_back(leftNode->val);
                if(nullptr != leftNode->left)
                {
                    rightStk.push(leftNode->left);
                }
                if(nullptr != leftNode->right)
                {
                    rightStk.push(leftNode->right);
                }
                leftStk.pop();
            }
            if(left.size()>0)
            {
                res.push_back(left);
            }
            vector<int> right;
            while(!rightStk.empty())
            {
                TreeNode* rightNode = rightStk.top();
                right.push_back(rightNode->val);
                if(nullptr != rightNode->right)
                {
                    leftStk.push(rightNode->right);
                }
                if(nullptr != rightNode->left)
                {
                    leftStk.push(rightNode->left);
                }
                rightStk.pop();
            }
            if(right.size()>0)
            {
                res.push_back(right);
            }
        }
        return res;

    }
};

 

posted @ 2015-08-27 21:22  linqiaozhou  阅读(255)  评论(0)    收藏  举报