代码随想录1月9日平衡二叉树、二叉树的所有路径

110.平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true

示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false

示例 3:

输入:root = []
输出:true

提示:

  • 树中的节点数在范围 [0, 5000] 内
  • -104 <= Node.val <= 104

思路

上一道题目刚写了递归计算当前树的最大深度,所以我们可以用来判断当前节点左右子树高度是否满足平衡二叉树的要求。

我从根节点开始判断,一层一层往下走,所以是自顶向下的解法,首先判断左子树与右子树高度相差是否小于等于1,若不是直接返回false,是的话继续向下一层递归。

class Solution {public boolean isBalanced(TreeNode root) {if(root==null){return true;}if(Math.abs(countLevel(root.left)-countLevel(root.right))<=1){return isBalanced(root.left)&&isBalanced(root.right);}}public int countLevel(TreeNode root){if(root==null){return 0;}return Math.max(countLevel(root.left),countLevel(root.right))+1;}
}

但是这样的解法虽然很直观,但是会发现countlevel调用的次数有点过多了,对于同一个节点,会重复调用,这导致时间复杂度有o(n2),我们可以换用自底向上的方法,减少调用的次数。

自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。

class Solution {public boolean isBalanced(TreeNode root) {return countLevel(root)>=0;}public int countLevel(TreeNode root){if(root==null){return 0;}int leftLevel=countLevel(root.left);int rightLevel=countLevel(root.right);if(leftLevel==-1||rightLevel==-1||Math.abs(leftLevel-rightLevel)>1){return -1;}else{return Math.max(leftLevel,rightLevel)+1;}}
}

257.二叉树的所有路径

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

 

示例 1:

输入:root = [1,2,3,null,5]
输出:["1->2->5","1->3"]

示例 2:

输入:root = [1]
输出:["1"]

提示:

  • 树中节点的数目在范围 [1, 100] 内
  • -100 <= Node.val <= 100

思路

之前基本没有接触过回溯的思想,一下子不知道怎么做,但其实递归和回溯思想密切相关,这里我们可以使用深度优先搜索法,每次碰到非叶子节点就分别递归左右节点,这个时候把之前存储的路径作为新递归的输入,相当于一个回溯的存档,左边节点的路径不会影响右边节点路径的记录。

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> paths=new ArrayList<String>();constructPaths(root,"",paths);return paths;}public void constructPaths(TreeNode root,String path,List<String> paths){if(root!=null){StringBuffer pathSB=new StringBuffer(path);pathSB.append(Integer.toString(root.val));if(root.left==null&&root.right==null) { //当前节点为叶子节点paths.add(pathSB.toString());}else{pathSB.append("->");constructPaths(root.left,pathSB.toString(),paths);constructPaths(root.right,pathSB.toString(),paths);}}}
}

在java中使用StringBuffer灵活构造字符串。

题解中还有一种方法使用的是广度优先搜索法。思路也是回溯法,和递归法的回溯不同的是它把存档点放在了队首。

class Solution {public List<String> binaryTreePaths(TreeNode root) {List<String> paths = new ArrayList<String>();if (root == null) {return paths;}Queue<TreeNode> nodeQueue = new LinkedList<TreeNode>();Queue<String> pathQueue = new LinkedList<String>();nodeQueue.offer(root);pathQueue.offer(Integer.toString(root.val));while (!nodeQueue.isEmpty()) {TreeNode node = nodeQueue.poll(); String path = pathQueue.poll();if (node.left == null && node.right == null) {paths.add(path);} else {if (node.left != null) {nodeQueue.offer(node.left);pathQueue.offer(new StringBuffer(path).append("->").append(node.left.val).toString());}if (node.right != null) {nodeQueue.offer(node.right);pathQueue.offer(new StringBuffer(path).append("->").append(node.right.val).toString());}}}return paths;}
}

总结

递归思想越来越熟练,但是有些地方的优化还需要注意一下。

第二题是第一次正式接触回溯法,理解了思路之后感觉也不是很难了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea右上角浏览器图标没有idea内部浏览器怎么显示

idea右上角浏览器图标没有idea内部浏览器怎么显示 file -> settings -> tools -> web brosers 选择需要的浏览器&#xff0c;勾选上展示到编辑器中 打开上图的Built-in Preview&#xff0c;就会显示idea标志的内部显示了&#xff01;&#xff01;&#xff01;

【Linux系统编程二十七】:线程的互斥与同步(互斥锁的使用与应用)

【Linux系统编程二十七】&#xff1a;线程的互斥与同步(互斥锁的使用与应用&#xff09; 一.问题:数据不一致(混乱/不安全)1.多线程并发计算不安全2.将数据加载到寄存器的本质 二.解决方法--互斥锁三.互斥锁的概念与接口1.定义锁2.加锁/解锁 四.互斥锁实现原理与应用1.原理&…

QT应用篇:QT解析与生成XML文件的四种方式

四种常见的解析 XML 的方式(DOM、SAX、以及基于 Qt 的 XmlStreamReader)各有自己的优缺点,适合不同的应用场景。 DOM 适合小型且结构简单的 XML 文件,需要频繁修改和操作整个文档结构的情况。SAX 适合大型 XML 文件,以及只需读取不需要修改的情况。基于 Qt 的 XmlStreamRe…

国内低代码开发平台排名 盘点十家主流低代码平台

随着数字化转型的加速&#xff0c;低代码开发平台作为一种新型软件开发方式&#xff0c;受到了广泛关注。国内低代码市场也呈现出蓬勃发展的态势&#xff0c;各种低代码平台如雨后春笋般涌现。本文将对国内低代码平台进行排名&#xff0c;以帮助企业和开发者更好地了解市场情况…

C盘清理详细教程,跟着我做,c盘想爆满也难【建议收藏】

C盘爆红对于咱们来说&#xff0c;简直太难受了&#xff0c;今天就总结一篇文章&#xff0c;专门用来教大家解决C盘空间不足的问题&#xff0c;优化步骤分为三个阶段&#xff0c;可以一步一步的进行。 目录 入门优化&#xff1a; 删除掉不用的软件 清空存储里面的临时文件&am…

论文设计任务书学习文档|TOPOLOGY网管软件的研究与实现

文章目录 论文&#xff08;设计&#xff09;题目&#xff1a;1、论文&#xff08;设计&#xff09;的主要任务及目标2、论文&#xff08;设计&#xff09;的主要内容3、论文&#xff08;设计&#xff09;的基本要求4、进度安排 论文&#xff08;设计&#xff09;题目&#xff1…

2024年跨境电商上半年有哪些营销节日?

2024年伊始&#xff0c;跨境电商开启新一轮的营销竞技&#xff0c;那么首先需要客户需求&#xff0c;节假日与用户需求息息相关&#xff0c;那么接下来小编为大家整理2024上半年海外都有哪些节日和假期&#xff1f;跨境卖家如何见针对营销日历选品&#xff0c;助力卖家把握2024…

告别冗余空白,批量删除空白行

你是否遇到过这样的尴尬情况&#xff1a;花费了大量时间整理的文档&#xff0c;却在最后发现其中充斥着无用的空白行&#xff0c;这些多余的空行不仅影响美观&#xff0c;还让整个文档显得杂乱无章。今天&#xff0c;我要给大家介绍一款强大且实用的工具——首助编辑高手&#…

【Java EE初阶八】多线程案例(计时器模型)

1. java标准库的计时器 1.1 关于计时器 计时器类似闹钟&#xff0c;有定时的功能&#xff0c;其主要是到时间就会执行某一操作&#xff0c;即可以指定时间&#xff0c;去执行某一逻辑&#xff08;某一代码&#xff09;。 1.2 计时器的简单介绍 在java标准库中&#xff0c;提供…

网络的设置

一、网络设置 1.1查看linux基础的网络设置 网关 route -n ip地址ifconfigDNS服务器cat /etc/resolv.conf主机名hostname路由 route -n 网络连接状态ss netstat域名解析nslooup host 例题&#xff1a;除了ping&#xff0c;什么命令可以测试DNS服务器来解析服务…

云计算历年题整理

目录 第一大题 第一大题HA计算 给出计算连接到EC2节点的EBS的高可用性(HA)的数学公式&#xff0c;如场景中所述&#xff1b;计算EC2节点上的EBS的高可用性(HA)&#xff1b;场景中80%的AWS EC2节点用于并行处理&#xff0c;总共有100个虚拟中央处理单元(vCPUs)用于处理数据&a…

IT行业下一个就业风口,鸿蒙开发者有多抢手?

2023年年尾&#xff0c;华为与各大应用厂商密集签约&#xff0c;使得鸿蒙操作系统再次引发关注。 2019年8月9日&#xff0c;华为消费者业务CEO余承东在华为开发者大会上发布了鸿蒙操作系统HarmonyOS&#xff0c;成为当年科技圈的爆炸性新闻。此后&#xff0c;HarmonyOS从1.0迭…