代码随想录算法训练营第十七天[三刷]|110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

110.平衡二叉树

  • 思路: 比较平衡的标准就是2边子树的高度差,那就分别算出两边的高度,如果 > 1 说明不符合就可以直接退出。
  • 遍历方式:再找子节点的时候,用到后序遍历的思想,因为根节点最后遍历就是为了最后收集子节点信息。
  • 递归函数: 因为递归的函数我需要的是返回高度或者 -1(已经在遍历中计算出不符合条件了)返回值应该是 Integer , 所以应该有一个helper function 去返回Int ,然后根据返回值判定是否是平衡树
    递归 先遍历左子,再右子:记住这里递归完左子树就需要直接进行判定,排除掉 -1的情况,否则-1 会进入到之后的高度差判定。
    • 单层递归逻辑计算:如果从前面拿到的左右子树差>1 直接返回 -1,否则继续+1 并且把这个信息传递上去

257. 二叉树的所有路径

递归

首先确定用哪种遍历: 前序 : 倒推,因为输出是从root 开始,下一个是他的左子,只有前序可以实现这样的输出。
(三刷得时候被人提醒说层序遍历也是可以的,先放个坑在这里,等四刷跑过来看争取实现)
之后确定递归的3步曲:

  1. 终止条件: 判定是子节点, 把之前存的path 直接放到res中,记得有一个加 -> 的逻辑实现
  2. 单个递归:如果不是子节点,就递归左边,记住出来的时候要回溯,因为后面要用到的path 是踢掉最后一个点的(回溯状态下的)path,或者可以说,踢掉path里存放的点,让当前递归栈的root就是path里所存放的点

迭代1
就是用一个显性stack完成深度遍历, 每一次遍历放进去2个参数,一个Node, 用来判定是否是childnode, 是的话就不必再加上“->” 了,一个path,是直接为了放当前Node的信息。

一个JAVA的技巧就是 int a = 5 , 5+“”; 可以把integer 直接转变成String

迭代2
也可以 用层序遍历完成该题目。用 queue 去记录当前遍历节点 和历史上的path String(这里要offer 2 个,之后会poll 2 个,相应 size 也会 -2 ),当判定遍历到子节点的时候,就把 path 加到结果List里面

404.左叶子之和

这个3种遍历都可以:因为只是求一个值,从上往下,或者从下往上上传递数值都可以
难点就是:如何判定 遍历到的叶子节点是 左孩子?
答: 遍历到倒数第二个node的时候(该点的父节点),看他的左孩子是否为空,如果不空,那这个node的左右节点是不是为null? 都为Null, 说明遍历到了左子节点,那就把当前root.left加进答案返回给上一层,

if ((node.left != null) && (node.left.left == null) && (node.left.right == null))
 return leftRes + rightRes + root.left.val;

迭代

具体操作如下:按照后序的模板,只不过在Pop出来的node时,对该node进行判断(判断逻辑如上)
最后返回 sum 即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值