zoukankan      html  css  js  c++  java
  • LeetCode 102. 二叉树的层序遍历 && 剑指 Offer 32

    地址  https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/

    给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
     
    
    示例:
    二叉树:[3,9,20,null,null,15,7],
        3
       / 
      9  20
        /  
       15   7
    返回其层序遍历结果:
    
    [
      [3],
      [9,20],
      [15,7]
    ]

    算法1
    同剑指 31 ,
    BFS遍历二叉树 ,添加了 遍历的树的层级
    根据层级决定新开vector或者直接push

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<vector<int>> ans;
        int curr = 0;
        vector<int> v;
        void bfs(TreeNode* root){
            if(root == NULL) return;
            queue<pair<TreeNode*,int>> q;
            q.push({root,0});
    
            while(!q.empty()){
                TreeNode* p = q.front().first; 
                int level = q.front().second; 
                q.pop();
    
                if(level > curr){
                    curr=level; 
                    ans.push_back(v);
                    v.clear();
                    v.push_back(p->val);
                }else{
                    v.push_back(p->val);
                }
    
                if(p->left!=NULL) q.push({p->left,level+1});
                if(p->right!=NULL) q.push({p->right,level+1});
            }
            ans.push_back(v);
    
            return;
        }
    
        vector<vector<int>> levelOrder(TreeNode* root) {
            bfs(root);
            return ans;
        }
    };

    算法2

    由于每层都使用了vector,也可以考虑使用dfs来做
    每次深度优先搜索到某层后,看看返回的数据结构中有没有当前层的记录vector
    如果没有则新建vector记录,有则直接push

    ==============================

    class Solution {
    public:
        vector<vector<int>> ans;
        void dfs(TreeNode* root,int level){
            if(root==NULL) return;
            
            if(ans.size() < level){
                vector<int> v{root->val};
                ans.push_back(v);
            }else{
                ans[level-1].push_back(root->val);
            }
            
            dfs(root->left,level+1);dfs(root->right,level+1);
        }
        
        vector<vector<int>> levelOrder(TreeNode* root) {
            dfs(root,1);
            
            return ans;
        }
    };
    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    转 Scott Mitchell的ASP.NET2.0数据指南中文版索引
    ASP.NET2.0中Gridview中数据操作技巧
    SQL语句导入导出大全
    SQL2000存储过程的基础教程
    如何取出Gridview选中行的数值
    asp.net2.0将EXCEL导入到MS Sql server2000
    C#泛型秘诀(5)
    C#泛型秘诀(4)
    C#泛型秘诀(1)
    C#泛型秘诀(2)
  • 原文地址:https://www.cnblogs.com/itdef/p/14345436.html
Copyright © 2011-2022 走看看