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驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    面向对象的三大特性(封装、继承、多态)-----继承
    前端---HTML
    几个排序算法的python实现
    构造方法关键字---this
    构造方法中关键字-- super
    多态(instanceof)
    接口
    抽象
    继承(重写与重载对比)
    数组的逆序
  • 原文地址:https://www.cnblogs.com/itdef/p/14345436.html
Copyright © 2011-2022 走看看