力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题)

这篇具有很好参考价值的文章主要介绍了力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题),leetcode,宽度优先,算法
采用队列

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode*> q;
        if(root==NULL) return root;
        q.push(root);
        int i=0;
        while(!q.empty())
        {
            TreeNode *cur=q.front();
            swap(cur->left,cur->right);
            if(cur->left) q.push(cur->left);
            if(cur->right) q.push(cur->right);
            q.pop();
        }
        return root;
    }
};

采用递归

class Solution {
public:

    TreeNode* invertTree(TreeNode* root) {
        if(root==NULL) return root;
        swap(root->left,root->right);
        invertTree(root->left);
        invertTree(root->right);
        return root;
    }
};

力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题),leetcode,宽度优先,算法

class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int> result;
        queue<TreeNode*> q;
        if(root==NULL) return result;
        q.push(root);
        while(!q.empty())
        {
            TreeNode *cur=q.front();
            result.push_back(cur->val);
            if(cur->left) q.push(cur->left);
            if(cur->right) q.push(cur->right);
            q.pop();

        }
        return result;
    }
};

力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题),leetcode,宽度优先,算法
第一个需要考虑的问题是 二维数组怎样在不知道行和列的情况下进行插入 :先定义一维数组,然后将一维数组插入二维数组!
第二个需要考虑的问题是 BFS中队列进行遍历每一层的时候既需要把当前结点的左右孩子结点存到队列里,同时当前层结束后
原来的思路BFS队列
不为空就入队 取出来 放进vector里 然后左右孩子继续放进队列里
存在的问题即第二个问题 我怎么知道当前层是否遍历结束 ???反正下一层孩子都会在队里,继续push_back根本无法做到 每一层遍历后的结果放在一维数组里
原来的代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        if(root==NULL) return result;
        queue<TreeNode*> q;
        TreeNode* cur=root;
        q.push(root);
        int i=0;
        while(cur||!q.empty())
        {
            vector<int> level;
            while(!q.empty())
            {
              cur=q.front();
              level.push_back(cur->val);
              q.pop();

              if(cur->left) q.push(cur->left);
              if(cur->right) q.push(cur->right);
            }
            if(level.size()!=0) result.push_back(level);
        }
        return result;
    }
};

这边就要对循环条件进行更改了
while(!q.empty())判断条件不对,更改成q.size()比如9,20在队列里,此时队列的size为2,那么只做两次,9一次,9没有孩子,20一次,20有孩子,当前走出循环,插入一维数组,

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        if(root==NULL) return result;
        queue<TreeNode*> q;
        TreeNode* cur=root;
        q.push(root);
        int i=0;
        while(!q.empty())
        {
            vector<int> level;
            int size=q.size();
            for(int i=0;i<size;i++)
            {
              cur=q.front();
              level.push_back(cur->val);
              q.pop();

              if(cur->left) q.push(cur->left);
              if(cur->right) q.push(cur->right);
            }
            if(level.size()!=0) result.push_back(level);
        }
        return result;
    }
};

力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题),leetcode,宽度优先,算法
之字形打印
在上面的基础上,偶数层就不动,奇数就reverse
当然每次重中之重不要忘记判空了,root==NULL文章来源地址https://www.toymoban.com/news/detail-599952.html

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode*> q;
        vector<vector<int>> result;
        if(root==NULL) return result;//不要忘记!
        q.push(root);
        int index=0;
        while(!q.empty())
        {
            vector<int> level;
            int size=q.size();
            for(int i=0;i<size;i++)
            {
                TreeNode* cur=q.front();
                if(!cur) continue;//不加也可以通过 ,但是加了减少执行用时和内存消耗
                level.push_back(cur->val);
                q.pop();
                if(cur->left) q.push(cur->left);
                if(cur->right) q.push(cur->right);
            }
            if(index%2!=0) reverse(level.begin(),level.end());//奇数就得reverse
            if(level.size()!=0) result.push_back(level);
            index++;
        }
        return result;
    }
};

到了这里,关于力扣256.翻转二叉树(递归/qBFS) 剑指offer 32 从上到下打印二叉树(q BFS)I II III(三道题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 剑指offer面试题6 重建二叉树

    分析 本题目输入的一个树的前序和中序遍历序列,要求把这颗树重建起来。这里需要了解到程序中有个特别重要的思维叫递归,递归是分层的,每一层的问题都是一样的,只不过问题的规模不一样,面对这类复杂问题你的思考方式一定是2点:1.问题该如何定义?第n层该如何

    2024年01月18日
    浏览(30)
  • 剑指offer:关于二叉树的汇总(c++)

    1、重建二叉树: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 2、树的子结构: 输入两棵二叉树A和B,

    2023年04月12日
    浏览(38)
  • Leetcode-每日一题【剑指 Offer 27. 二叉树的镜像】

    请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入:      4    /     2     7  /   / 1   3 6   9 镜像输出:      4    /     7     2  /   / 9   6 3   1 示例 1: 输入: root = [4,2,7,1,3,6,9] 输出: [4,7,2,9,6,3,1] 限制: 0 = 节点个数 = 1000 1.题目要求我们设

    2024年02月13日
    浏览(31)
  • (树) 剑指 Offer 27. 二叉树的镜像 ——【Leetcode每日一题】

    难度:简单 请完成一个函数,输入一个二叉树,该函数输出它的镜像。 例如输入: 镜像输出: 示例 1: 输入:root = [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 限制 : 0 = 节点个数 = 1000 注意 :本题与 226. 翻转二叉树 相同。 💡思路:递归 我们从根节点开始,递归地对树进行遍历: 如果

    2024年02月13日
    浏览(26)
  • 剑指 Offer 32 - III. 从上到下打印二叉树 III

    目录 使用函数实现 使用双端队列实现 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。 例如: 给定二叉树:  [3,9,20,null,null,15,7] , 返回其层次遍历结果:

    2024年02月11日
    浏览(31)
  • 《剑指 Offer》专项突破版 - 面试题 47 : 二叉树剪枝(C++ 实现)

    题目链接 :LCR 047. 二叉树剪枝 - 力扣(LeetCode) 题目 : 一棵二叉树的所有节点的值要么是 0 要么是 1,请剪除该二叉树中 所有节点的值全都是 0 的子树 。例如,在剪除下图 (a) 中二叉树中所有节点值都为 0 的子树之后的结果如下图 (b) 所示。 分析 : 首先分析哪些子树会被

    2024年02月20日
    浏览(29)
  • 二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”

    各位CSDN的uu们你们好呀,今天继续数据结构与算法专栏中的二叉树,下面,让我们进入二叉树的世界吧!!! 二叉树(上)——“数据结构与算法”_认真学习的小雅兰.的博客-CSDN博客 二叉树链式结构的实现 二叉树链式结构的实现 求二叉树的高度 但是这种写法有很大的问题

    2024年02月17日
    浏览(29)
  • 二叉树BFS/DFS及重要递归接口--拿下二叉树--拿下数据结构--拿到好offer

     堆是一种特殊的二叉树(完全二叉树),由于有堆排序等实际的需求,堆是由类似顺序表的结构实现的,这是为了方便堆能够通过下标找到parent和child,进行比较大小以及交换等操作。 这里我们建立二叉树的每个结点,包含左右孩子指针left和right,还有存储的数据data。 然后

    2023年04月08日
    浏览(39)
  • Leetcode-每日一题【剑指 Offer 32 - I. 从上到下打印二叉树】

    从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树:  [3,9,20,null,null,15,7] ,     3    /   9  20     /     15   7 返回: [3,9,20,15,7] 提示: 节点总数 = 1000 1.题目要求我们从上到下打印出二叉树的每个节点,同一层的节点按照从左

    2024年02月12日
    浏览(36)
  • Leetcode-每日一题【剑指 Offer 34. 二叉树中和为某一值的路径】

    给你二叉树的根节点  root  和一个整数目标和  targetSum  ,找出所有  从根节点到叶子节点  路径总和等于给定目标和的路径。 叶子节点  是指没有子节点的节点。 示例 1: 输入: root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22 输出: [[5,4,11,2],[5,8,4,5]] 示例 2: 输入: ro

    2024年02月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包