• 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]
    ]
    

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

    需要注意的是:

    深度优先算法要用栈来实现,广度优先需要用队列来实现。之前都是用深度优先算法,这是第一次写关于广度优先算法的实例。

    PS:写代码时一定要注意复制粘贴所带来的错误·····················

    /**
     * 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;  
        }  
    };  

      

  • 相关阅读:
    go module配置
    beego conf配置文件
    go string类型的特性
    go语言简单介绍,增强了解
    beego项目和go项目 打包部署到linux
    第一个go程序
    linux下vim编辑器查找 关键字
    配置ngnix下的虚拟主机
    PHP中文无乱码截取
    #1040
  • 原文地址:https://www.cnblogs.com/qiaozhoulin/p/4764670.html
Copyright © 2020-2023  润新知