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

110.平衡二叉树

参考视频和详解

代码随想录

我的想法

整棵树最大高度和最小高度的差小于等于1,就是平衡二叉树

❌思路问题:

对平衡二叉树的理解错误。平衡二叉树需要在每个节点级别检查子树的高度差,而不仅仅是整棵树的最大和最小高度。

优解思路

1. 什么是平衡二叉树

二叉树里的任何一个节点,左右子树的高度差不超过1

2. 如何判断是不是平衡二叉树

要判断每一个节点的左右子树高度差是否超过1。当任何一个节点的左右孩子的高度差超过1,就不是平衡二叉树

3. 如何标记左右子树的差值是否大于1

返回-1

4. 区分高度和深度

高度向上,深度向下

5. 求高度和深度各用什么遍历方式

高度用后序(左右中),深度用前序(中左右)

代码实现

1. 确定参数和返回值

int getHeight(TreeNode node)

2. 确定终止条件

if(node== null){

return 0

}

3. 确定单层递归逻辑

⚠️要在每个节点处检查高度差

 

257. 二叉树的所有路径 (没懂)

参考视频和详解

代码随想录

我的想法

前序遍历

每遍历完一遍如何回到根节点?

优解思路

  1. 前序遍历
  2. 回溯:解决遍历完回到根节点的问题

每遍历完一遍,把5弹出,把2弹出,回到根节点1,把3加进来

代码实现

1. 确定参数和返回值

List traverse(TreeNode node, List<Integer> path, List<String> result)

path是单条路径,数组类型,地址拷贝

2. 确定终止条件

if(node.left == null && node.right == null) { //说明遍历到叶子节点了

result.append(path);

return result;

}

3. 单层递归逻辑

path.append(node.val); //注意这里要放在终止条件的上面,否则path会漏掉叶子节点

if(node.left != null){  //注意要判断孩子节点是否为空,否则会空指针异常

traverse(node.left, path, result);

path.remove(path.size() - 1);  //回溯

}

if(node.right != null){

traverse(node.right, path, result);

path.remove(path.size() - 1);  //回溯

}

 

 404.左叶子之和

参考视频和详解

代码随想录

优解思路

后序遍历

难点:以前的二叉树题目是通过节点的孩子判断本节点的属性,这道题要通过父节点判断本节点的属性。即在上一层判断下一层有没有左叶子,要找的是其父节点

  1. 节点必须是叶子节点,且是父节点的左孩子
  2. 如何判断节点6是不是我们要收集的元素?
    遍历到9,判断9的左孩子6是否为空。如果不为空,且6的左孩子和右孩子都为空,说明6就是要找的左叶子节点
  3. 后序遍历,收集左子树的左叶子之和,和右子树的左叶子之和,返回上一层

代码实现

1. 确定参数和返回值

int traversal(TreeNode node)

2. 确定终止条件

if(node == null){

        return 0;

}

If(node.left == null && node.right == null){

         return 0;   //遍历到叶子节点时要返回0,因为还不确定是不是左孩子

}

3. 确定单层递归逻辑

int leftNum = traversal(node.left);

if(node.left != null & node.left.left != null & node.left.right != null){

        leftNum = node.left.val;

}

int rightNum = traversal(node.right);

int sum = leftNum + rightNum;

return sum;

 

  • 17
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值