代码随想录算法训练营第十五天| 层序遍历(即广度优先搜索), 226.翻转二叉树,101. 对称二叉树

news2024/12/22 20:29:38

层序遍历(即广度优先搜索)

需要借用一个队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。

思路是先把根节点加入队列,然后在遍历下一层前,先将队列拥有的当前层元素加入到结果集中,然后再将当前节点的左节点,右节点加入到队列中


class Solution {
    List<List<Integer>> resList=new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun(root);
        return resList;


    }
    //BFS--迭代方式--借助队列
    public void checkFun(TreeNode node){
        if(node==null){return;}
        Queue<TreeNode> que=new LinkedList<TreeNode>();//借助辅助队列
        que.offer(node);//向队尾插入元素
        while(!que.isEmpty()){
            List<Integer> itemList=new ArrayList<Integer>();
            int len=que.size();
            while(len>0){//这里不能是 while(!que.isEmpty()),因为如果是那样子,那么外层while循环就不执行了
                TreeNode tmpNode=que.poll();//拿出队头元素
                itemList.add(tmpNode.val);
                if(tmpNode.left!=null){que.offer(tmpNode.left);}
                if(tmpNode.right!=null){que.offer(tmpNode.right);}
                len--;
            }
            resList.add(itemList);   
        }

    }

}

 226.翻转二叉树

226. 翻转二叉树

解法一BFS  

思路:先将根节点添加到队列中,队列不为空,则计算出队列的长度size,如果size大于0则一直反转当前遍历到的节点的左右树

 //BFS
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //层序遍历吧
        if(root==null){return null;}
        Deque<TreeNode> deque=new ArrayDeque<>();
        deque.offer(root);//插入元素到队尾
        while(!deque.isEmpty()){
            int size=deque.size();
            while(size-->0){
                TreeNode node=deque.poll();//移除队头元素
                swap(node);
                if(node.left!=null){deque.offer(node.left);}
                if(node.right!=null){deque.offer(node.right);}
            }
        }
        return root;
    }
    public void swap(TreeNode root){
        TreeNode temp=root.left;
        root.left=root.right;
        root.right=temp;

    }
}

解法二DFS

思路:就是这里注意中序遍历是无法达到反转的要求的,不信可以自己举个例子

采用后序遍历,首先递归将左子树和右子树翻转,最后翻转根节点

//DFS递归
class Solution {
   /**
     * 前后序遍历都可以
     * 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)
     */
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        invertTree(root.left);
        invertTree(root.right);
        swapChildren(root);
        return root;
    }

    private void swapChildren(TreeNode root) {
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }
}

101. 对称二叉树

注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点

思路

比较左节点的外侧和右节点的外侧,比较左节点的里侧和右节点的里侧

 考虑五种情况

节点为空的情况有:(这是终止条件)

  • 左节点为空,右节点不为空,不对称,return false
  • 左不为空,右为空,不对称 return false
  • 左右都为空,对称,返回true
  • 左右节点不为空,且数值也不相同的情况我们也处理了
  • 第五种情况是都不为空且数值相等
class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left,root.right);

    }
    boolean compare(TreeNode left,TreeNode right){  //递归函数参数和返回值
       //终止条件们
       if(left==null&&right!=null){return false;}
       if(left!=null&&right==null){return false;}
       if(left==null&&right==null){return true;}
       if(left!=null&&right!=null&&left.val!=right.val){return false;}
       //第五种情况就是非空且数值相同的情况

       //单层递归逻辑
       boolean b1=compare(left.left,right.right);
       boolean b2=compare(left.right,right.left);
       return b1&&b2;
       
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/860379.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode150道面试经典题--找出字符串中第一个匹配项的下标(简单)

1.题目 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返回 -1 。 2.示例 3.思路 回溯算法&#xff1a;首先将…

【CSS3】CSS3 动画 ⑥ ( 动画属性示例 | 精灵图帧动画效果实现 )

文章目录 一、需求说明二、代码分析1、动画属性2、布局分析3、动画实现 三、完整代码示例 一、需求说明 给定一张精灵图 , 其中有多个 动画帧 对应的图片 , 下图的大小是 1600 x 100 像素 , 截图展示如下 : 实际图片 : 二、代码分析 1、动画属性 使用上图实现 逐帧动画 效果 …

智慧工地云平台源码

智慧工地可以实现对人员管理、施工进度、安全管理、材料管理、设备管理、环境监测等方面的实时监控和管理&#xff0c;提高施工效率和质量&#xff0c;降低安全风险和环境污染。在道路施工中&#xff0c;智慧工地可以实现对道路状况、交通流量、施工进度等方面的实时监控和管理…

Wlan——802.11协议物理层关键技术(OFDM、MIMO、BSS)和CSMA/CD机制的介绍

目录 802.11协议的发展 802.11协议物理层关键技术 信道捆绑技术 OFDM/OFDMA技术 Short-Gi短保护间隔技术 MIMO/MU-MIMO技术 QAM技术 BSS Color快速识别 802.11MAC层关键技术CSMA/CD机制 为什么无线提出了CSMA/CD机制 CSMA/CD的工作机制 CSMA/CD的工作原理 CSMA/CD…

matlab进行mex时出现 error LNK2019: 无法解析的外部符号

解决方法分成三个步骤&#xff1a; 1、直接在simulink模块运行出现错误&#xff0c;找不到该s函数&#xff1b; 2、需要确认安装了编译器。mex -setup 确认安装了编译器&#xff0c;再次mex xxx.c未解决&#xff1b; 3、再次查找资料发现可能编译器不知道具体的位置&#xff0c…

Java训练六

目录 一、除数不能为0 二、校验年龄格式 三、终端循环 四、 计算最大公约数 一、除数不能为0 使用静态变量、静态方法以及throws关键字&#xff0c;实现当两个数相除且除数为0时&#xff0c;程序会捕获并处理抛出的ArithmeticException异常&#xff08;算术异常&#xff09…

电脑合上盖子无线网络不会断开

控制面板\硬件和声音\电源选项\系统设置 最终选择不会采取任何操作 选择不会采取任何操作

学习C语言第三天 :关系操作符、逻辑操作符

1.关系操作符 C语言用于比较的表达式&#xff0c;称为“关系表达式”里面使用的运算符就称(relationalexpression)&#xff0c;为“关系运算符” (relationaloperator) &#xff0c;主要有下面6个。 > 大于运算符 < 小于运算符 > 大于等于运算符 < 小于等…

分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

文章目录 1. kafka 生产者发送消息整体架构2. Kafka 生产者重要参数配置01. acks02. 消息传递时间03. linger.ms04. buffer.memory05. batch.size06. max.in.flight.requests.per.connection07. compression.type08. max.request.size09. receive.buffer.bytes和 send.buffer.b…

如何使用appuploader制作apple证书​

转载&#xff1a;如何使用appuploader制作apple证书​ 如何使用appuploader制作apple证书​ 一.证书管理​ 点击首页的证书管理 二.新建证书​ 点击“添加”&#xff0c;新建一个证书文件 免费账号制作证书只有7天有效期&#xff0c;没有推送消息功能&#xff0c;推送证书…

anaconda 基本指令

1.anaconda创建环境 例如我们创建一个名称为img2word&#xff0c;python版本为3.9的环境 conda create -n img2word python3.9在这个命令中&#xff1a; create 是告诉 Conda 你要创建一个新的环境。-n img2word 是设置新环境的名称为 img2word。python3.9 是告诉 Conda 在这…

PS AI版本安装教程

好久没写博客了&#xff0c;今天更新一下子吧&#xff01; 随着chatGPT的提出&#xff0c;各种软件逐渐开始镶嵌人工智能&#xff0c;为我们的生活带来了极大的便利&#xff01;话不多说&#xff0c;开始介绍今天的主角&#xff0c;PS的AI版本。 安装教程&#xff1a; 1.安装…

Linux学习之sed删除、追加、插入、更改、读写文件、下一行、打印、退出和seq命令

cat /etc/redhat-release看到操作系统是CentOS Linux release 7.6.1810&#xff0c;uname -r看到内核版本是3.10.0-957.el7.x86_64&#xff0c;sed --version可以看到sed版本是4.2.2。 echo a : 1 : good : g >> sed_daicpnrwq.txt echo b : 2 : well : w >> sed…

LC-删除排序链表中的重复元素

LC-删除排序链表中的重复元素 链接&#xff1a;https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/ 思路&#xff1a;这题其实不难&#xff0c;链表已经排序&#xff0c;我们只要把相邻的两个节点的值进行比较&#xff0c;如果相同&#xff0c;删…

基于SpringBoot的社区团购系统设计【附开题|万字文档(LW)和搭建文档】

主要功能 前台界面&#xff1a; ①首页、商品信息推荐、社区信息、商品信息展示、查看更多等 ②商品信息、名称类型查询、添加购物车、立即购买、积分兑换、点我收藏、赞一下、踩一下、评论等 ③团购信息、社区信息、购物车等 ④个人中心、我的订单、我的地址、我的收藏等 后台…

VBA技术资料MF42:VBA_从Excel中上面的单元格复制公式

【分享成果&#xff0c;随喜正能量】唯有梦想才配让你不安&#xff0c;唯有行动才能解除你的不安.绳锯木断&#xff0c;水滴石穿。也许你现在做的事情很小&#xff0c;只要你能日积月累的坚持下去&#xff0c;才会发现意义非凡。所谓的成功&#xff0c;便是别人失败的时候你还在…

matplotlib FormatStrFormatter设置坐标轴的标注为整数和小数【设置小数点的数目】

利用FormatStrFormatter 进行设置 1 设置为整数 import matplotlib.pyplot as plt from matplotlib.ticker import FormatStrFormatter# 创建一个图表 fig, ax plt.subplots()# 生成一些示例数据 x [1, 2, 3, 4, 5] y [1000, 2000, 3000, 4000, 5000]# 在 x 轴上设置刻度标…

MATLAB计算一组坐标点的相互距离(pdist、squareform、pdist2函数)

如果有一组坐标P(X,Y)&#xff0c;包含多个点的X和Y坐标&#xff0c;计算其坐标点之间的相互距离 一、坐标点 P[1 1;5 2;3 6;8 8;4 5;5 1; 6 9];二、pdist函数 输出的结果是一维数组&#xff0c;获得任意两个坐标之间的距离&#xff0c;但没有对应关系 Dpdist(P)三、square…

@Transactional失效的场景

1. 类没被Spring管理 解决方法: 贴上注解Service、Component 等交由Spring管理 2. private修饰的方法 解决方法: 修改成 public, 只有public才生效 3. try{}catch(){只打印异常信息} 解决方法: 捕获异常&#xff0c;并继续抛出原捕获的异常, 或抛出运行时异常 throw new Runti…

微服务04-elasticsearch

1、es概念 1.1 文档和字段 elasticsearch是面向**文档(Document)**存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在elasticsearch中: 而Json文档中往往包含很多的字段(Field),类似于数据库中的列。 1.2 索引和映射 索引(…