LeetCode 110.平衡二叉树

分析1.0

求左子树高度和右子树高度,若高度差>1,则返回false,所以我递归了两遍

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

失误

若在遍历过程中已经发现高度不平衡了,那这时其实就该返回false,但是返回结果类型是高度int,只能用特殊值来指代这种情况,遍历过程中发现不平衡了就返回-1,发现当前节点是-1了就该返回-1

分析2.0

class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null){
return true;
}
return postOrder(root) == -1 ? false : true;
} public int postOrder(TreeNode p){
if(p == null){
return 0;
}
int left = postOrder(p.left);
if(left == -1) return -1;
int right = postOrder(p.right);
if(right == -1) return -1;
if(Math.abs(left-right)>1) {
return -1;
}
return Math.max(left,right)+1;
}
}

LeetCode 257. 二叉树的所有路径

分析1.0

模拟访问路径的过程,从根节点访问到最左叶节点 ,访问过程中不断push经过的节点

逻辑:

path加入当前节点、如果当前节点是叶节点,添加path,返回,删除当前加入的节点;如果是左节点或右节点,进入递归;

关键在于递归时什么时候删除访问过的节点,访问左节点完了删除左节点,访问右节点完了删除右节点,访问自己完了,删除自己

class Solution {
List<String> res = new ArrayList();
List<Integer> path = new ArrayList();
public List<String> binaryTreePaths(TreeNode root) {
preOrder(root);
// 这里也可以看做是一次递归 递归结束后才能删除本节点
// path.remove(path.size() - 1);
System.out.println("path为-----"+path);
return res;
}
public void preOrder(TreeNode p){
// 对当前节点进行操作 节点的数目范围在[1,100] 肯定有节点,不必判空
path.add(p.val);
// 到达叶节点 遍历完一条路径 此条路径加入当前节点后回溯
if(p.left == null && p.right == null){
//System.out.println("当前叶子节点"+p.val);
StringBuilder sb = new StringBuilder();
for(int i = 0; i < path.size() - 1; i++){
sb.append(path.get(i)).append("->");
}
res.add(sb.append(path.get(path.size() - 1)).toString());
return;
}
// 遍历左子树
if(p.left != null){
//加入节点
//System.out.println(p.left.val);
preOrder(p.left);
// 删除节点
//System.out.println("删除的节点"+path.get(path.size()-1));
// 这里也要回溯删除加入的节点和->
path.remove(path.size() - 1);
}
// 遍历右子树
if(p.right != null){
preOrder(p.right);
// 这里也要回溯删除加入的节点和->
path.remove(path.size() - 1);
}
//path.remove(path.size() - 1); //这里不能再删除了 前面递归结束已经删除一次了
}
}

LeetCode 404.左叶子之和

分析1.0

递归,但是递归的过程中要判断一个节点是否为左叶子

失误 

光想着节点本身了,但是光凭借节点自身的信息无发判断一个节点是左孩子还是右孩子,左右孩子是通过父节点指针来确定的,叶子节点则再加一个限制

分析2.0

遍历节点,if当前节点cur为空,返回,if左孩子的左右节点都为null,则cui.left为左叶子

if(root.left != null && root.left.left == null && root.left.right == null) 访问节点保证节点非null

class Solution {
int sum = 0;
public int sumOfLeftLeaves(TreeNode root) {
preOrder(root);
return sum;
} public void preOrder(TreeNode root){
if(root == null){
return;
}
if(root.left != null && root.left.left == null && root.left.right == null){
sum+=root.left.val;
}
preOrder(root.left);
preOrder(root.right);
}
}

总结

  1. 二叉树节点的深度:指从根节点到该节点的最长简单路径边的条数。
  2. 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数。
  3. 回溯要和递归永远在一起,递归后一定要回溯,必须在同一个代码块中
  4. 当前节点为空,直接返回,不用再考虑left right节点了
  5. 操作某个节点,一定要保证这个节点不为空
  6. 方法只执行一次,可以看做只递归一次; 递归主体逻辑,结束条件,返回参数+形式参数,先判是结束递归,还是先执行递归逻辑,递归后又该如何做

常用变量名增量更新

size、val、ans、cnt、cur、pre、next、left、right、index、gap、tar、res、src、len、start、end、flag、ch、var

 

代码随想录算法训练营day17 | leetcode ● 110.平衡二叉树 ● 257. 二叉树的所有路径 ● 404.左叶子之和的更多相关文章

  1. LeetCode 404. 左叶子之和(Sum of Left Leaves)

    404. 左叶子之和 404. Sum of Left Leaves LeetCode404. Sum of Left Leaves 题目描述 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 ...

  2. [LeetCode]404. 左叶子之和(递归)、938. 二叉搜索树的范围和(递归)(BST)

    题目 404. 左叶子之和 如题 题解 类似树的遍历的递归 注意一定要是叶子结点 代码 class Solution { public int sumOfLeftLeaves(TreeNode roo ...

  3. Java实现 LeetCode 404 左叶子之和

    404. 左叶子之和 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 /** * Definiti ...

  4. 【LeetCode】404. 左叶子之和

    404. 左叶子之和 知识点:二叉树 题目描述 计算给定二叉树的所有左叶子之和.. 示例 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 解 ...

  5. LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15

    110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...

  6. Java实现 LeetCode 110 平衡二叉树

    110. 平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9 ...

  7. LeetCode 110.平衡二叉树(C++)

    给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1. 示例 1: 给定二叉树 [3,9,20,null,nu ...

  8. LeetCode 257 二叉树的所有路径

    题目: 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / \ 2 3 \ 5 输出: ["1->2->5&quo ...

  9. [LeetCode 110] - 平衡二叉树 (Balanced Binary Tree)

    问题 给出一棵二叉树,判断它是否在高度上是平衡的. 对于本问题,高度上平衡的二叉树定义为:每个节点的两棵子树的深度差永远不大于1的一棵二叉树. 初始思路 根据定义,思路应该比较直接:递归计算每个节点左 ...

  10. 【leetcode 简单】 第九十四题 左叶子之和

    计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 # Definition for a binary ...

随机推荐

  1. v-if v-for同时使用 解决eslint报错问题

    <template v-for="sec in item.goods"> <div v-if="item.showDetail" class= ...

  2. OpenVINO计算机视觉模型加速

    OpenVINO计算机视觉模型加速 OpenVINO介绍 计算机视觉部署框架,支持多种边缘硬件平台 Intel开发并开源使用的计算机视觉库 支持多个场景视觉任务场景的快速演示 四个主要模块: 1.开发 ...

  3. 【openEuler系列】部署文件共享服务Samba

    个人名片: 对人间的热爱与歌颂,可抵岁月冗长 Github‍:念舒_C.ying CSDN主页️:念舒_C.ying 个人博客 :念舒_C.ying 目录 1 配置环境 2 配置软件安装源 3 安装文 ...

  4. GOCVHelper图像处理算法库实例整编

        GOCVHelper主要包含图像处理.图像增强和基础文件处理三个部分.由于前两个部分较具有通用性,而且我在不同项目中都进行了反复使用,为了进一步说明类库内容,这里反过来从项目角度出发,对现有的 ...

  5. win7安装Anaconda+TensorFlow(cpu版)+配置PyCharm

    本着不折腾不舒服斯基,好久没安装软件玩了.今天趁天气不错,安装下TensorFlow(cpu版)(因为没钱上GPU),首先在网上搜了下教程,原文出处: https://blog.csdn.net/u0 ...

  6. 控制台运行java

    控制台执行java 新建java代码 新建一个记事本文件,将文件名改为HelloWorld.java,注意:后缀是.java. 若没有显示文件后缀,可以在资源管理器打开显示后缀,然后再次修改文件名,一 ...

  7. [python] 圆形嵌套图Circular Packing

    圆形嵌套图Circular Packing 文章目录 圆形嵌套图Circular Packing 1 具有一级层次的圆形嵌套图绘制 1.1 绘图数据与circlify计算 1.2 图形绘制 1.2.1 ...

  8. 使用插件式开发称重仪表驱动,RS232串口对接各类地磅秤数据实现ERP管理

    在ERP系统中,采集一线的生产数据是重要工作之一,而称重计量是企业的核心资产数据,人工计重费时费力,还容易出错,重量数据是否正确,直接影响企业的采购或销售额.基于此,由系统对接电子秤实现自动抓取数据是 ...

  9. VMware Workstation Pro 16安装CentOS7超详细图文步骤

    安装的需要 VMware官方网站安装VMware Workstation Pro 16: https://download3.vmware.com/software/wkst/file/VMware- ...

  10. JavaFx 页面和控件设置快捷键

    原文:JavaFx 页面和控件设置快捷键 - Stars-One的杂货小窝 之前说过一篇window系统全局快捷键的设置,本期主要是讲解JavaFx应用程序的快捷键设置,还是有所区别的 这里主要是To ...