zoukankan      html  css  js  c++  java
  • leetcode Binary Tree Level Order Traversal

    给定一个数,广度优先输出记录。例如:

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

        3
       / 
      9  20
        /  
       15   7

    return its level order traversal as:

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

    思考了一下,居然被我想到了用队列来存储每一层的数据。嘿嘿。

    用两个队列,一个队列用来输出,一个队列用来记录下一层的所有左右节点,然后循环使用两个队列即可。

    /**
     * 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> > levelOrder(TreeNode *root) 
        {
            vector<vector<int> > ans;
            if (!root) return ans;
            
            vector<int> tmp;
            TreeNode *lf, *ri, *p;
            queue<TreeNode *> q1, q2;
            q1.push(root);
            
            while(!q1.empty() || !q2.empty())
            {
                while(!q1.empty())
                {
                    p = q1.front();
                    q1.pop();
                    tmp.push_back(p -> val);
                    if (p -> left)
                        q2.push(p -> left);
                    if (p -> right)
                        q2.push(p -> right);
                }
                ans.push_back(tmp);
                tmp.clear();
                if (q1.empty() && q2.empty()) return ans; // q1完,判断是否都为空
    
                while(!q2.empty())
                {
                    p = q2.front();
                    q2.pop();
                    tmp.push_back(p -> val);
                    if (p -> left)
                        q1.push(p -> left);
                    if (p -> right)
                        q1.push(p -> right);
                }
                ans.push_back(tmp);
                tmp.clear();
            }
            return ans;
        }
    };

    一开始使用两个flag标记,来判断是否进入了中间的两个while是否进入,用来判断是否要pushback。后面发现只要在上面注释部分判断是否都为空就行。

    当然,我用到了两个队列。可不可以只用一个呢。

    用一个队列的话就是用NULL来判断分层。每次完后输入一个NULL。例如:

    /**
     * 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> > levelOrder(TreeNode *root) {
            // IMPORTANT: Please reset any member data you declared, as
            // the same Solution instance will be reused for each test case.
            vector<vector<int> >res;
            if(root == NULL)return res;
            queue<TreeNode*> myqueue;
            myqueue.push(root);
            myqueue.push(NULL);//NULL是层与层之间间隔标志
            vector<int> level;
            while(myqueue.empty() == false)
            {
                TreeNode *p = myqueue.front();
                myqueue.pop();
                if(p != NULL)
                {
                    level.push_back(p->val);
                    if(p->left)myqueue.push(p->left);
                    if(p->right)myqueue.push(p->right);
                }
                else
                {
                    res.push_back(level);
                    if(myqueue.empty() == false)
                    {
                        level.clear();
                        myqueue.push(NULL);
                    }
                }
            }
            return res;
        }
    };
  • 相关阅读:
    php测试题整理(0519)
    Ajax调用返回json,xml数据类型(0517--pm)
    python 收集测试日志--格式
    python3下tomorow模块报语法错误def async(n, base_type, timeout=None): ^ SyntaxError: invalid syntax
    appium 下载
    VMware 虚拟机设置固定ip
    Centos7 安装配置 SVN
    【Linux】 Centos7 安装 mysql-8.0
    win7 SP1 64位 原版 百度网盘下载
    win10操作系统 64位 原版 百度网盘下载
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4127530.html
Copyright © 2011-2022 走看看