当前位置: 首页 > news >正文

Day28-代码随想录-平衡二叉树110+二叉树的所有路径257

平衡二叉树题目如下:

平衡二叉树的定义是左右子树的高度差不能大于1。看到这种类型的题,一般会想到用递归的方法来做,一旦用递归,就需要明确递归的三部曲。(1)递归函数的输入和返回值:输入-当前节点作为根节点,返回值肯定是高度;(2)递归终止条件:对于二叉树来说,一般递归的终止条件都是当前节点为空,返回0;(3)单层递归的逻辑:需要判断左右子树的高度差,如果已经大于1,说明不是平衡二叉树,直接返回-1;这样的话,还需要在得到左右子树的高度时,顺便判断一下之前的左右子树是否已经返回了-1,说明之前的子树已经不是平衡二叉树了,所以也就不需要后续的递归了,可以直接返回-1.代码如下:

class Solution {
    public boolean isBalanced(TreeNode root) {
        //使用递归法求根节点的左右子树的高度差
        //1.确定递归函数的输入和返回值:输入-将当前结点作为根节点,返回高度
        return getHeight(root) != -1;
    }
    public int getHeight(TreeNode root){
        //2.递归终止条件
        if(root == null) return 0;
        int leftHeight = getHeight(root.left);
        if(leftHeight == -1){
            return -1;//说明左子树里面早就不是平衡二叉树了
        }
        int rightHeight = getHeight(root.right);
        if(rightHeight == -1){
            return -1;//说明右子树里面早就不是平衡二叉树了
        }
        if(Math.abs(leftHeight-rightHeight)>1){
            return -1;//说明左右子树高度差大于1,不是平衡二叉树
        } 
        return Math.max(leftHeight, rightHeight)+1;
    }
}

二叉树的所有路径题目如下:

思路:这里需要对二叉树进行遍历,前序遍历是最合适的,因为他能指向它的左右孩子。递归与回溯是相伴相生的,递归遍历的过程中,一旦遇到叶子结点,就要回溯,不然无法回到其他路径分叉点。在这里,递归的终止条件就不像之前那样遇到空节点返回0,这里是遇到叶子节点后对其进行处理(收获结果的过程)

class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        //存放最终结果字符串
        List<String> result = new ArrayList<>();
        if(root == null) return result;
        //存放结果中的路径,因为要回溯,所以是Integer类型
        List<Integer> paths = new ArrayList<>();
        //遍历树
        traversal(root, paths, result);
        return result;
    }
    public void traversal(TreeNode root, List<Integer> paths, List<String> result){
        //首先将根结点/中结点加进路径
        paths.add(root.val);
        //递归函数终止条件:当遇到叶子结点
        if(root.left == null && root.right == null){
            //定义一个容器进行结果处理
            StringBuffer sb = new StringBuffer();// StringBuilder用来拼接字符串,速度更快
            for(int i =0; i < paths.size()-1; i++){
                sb.append(paths.get(i)).append("->");
            }
            //加上叶子节点
            sb.append(paths.get(paths.size()-1));
            //将整个路径放入结果集中
            result.add(sb.toString());//注意要使用toString进行转换
            return;
        }
        //递归+回溯,两者相伴而生
        //递归和回溯是同时进行,所以要放在同一个花括号里
        if(root.left != null){
            traversal(root.left, paths, result);
            //回溯,返回节点的上一层
            paths.remove(paths.size()-1);
        }
        if(root.right != null){
            traversal(root.right, paths, result);
            //回溯,返回节点的上一层
            paths.remove(paths.size()-1);
        }
    }
}

相关文章:

  • 责任链模式-java
  • tkinter日历程序的设计
  • 【vue】warning:Avoid mutating a prop directly
  • 53.第二阶段x86游戏实战2-c++实现自动打怪2
  • 【动态规划】路径问题
  • 单片机和微控制器知识汇总——《器件手册--单片机、数字信号处理器和可编程逻辑器件》
  • STM32F103_LL库+寄存器学习笔记02 - 开启SysTick(滴答定时器)中断
  • QinQ项展 VLAN 空间
  • 数据结构与算法:Dijkstra算法和分层图最短路
  • 技术赋能与创新实践:基于低代码平台的高性能应用开发
  • YoloV8训练和平精英人物检测模型
  • Vue动态绑定:文本框、单选按钮、下拉列表、多选按钮
  • Java运行时的堆、栈和方法区
  • 参考apollo3 FLASH样例改写实际应用的接口函数(带磨损均衡处理)
  • 导入 Excel 规则批量修改或删除 PDF 文档内容
  • 【网络】手机PUSH消息发送自建IM通道实现方案
  • 【Pandas】pandas Series to_csv
  • C++学习:六个月从基础到就业——C++基础语法回顾:指针与引用基础
  • 5款视觉OCR开源模型
  • WELL健康建筑认证是什么?
  • 有没有做网站的公司/东莞精准网络营销推广
  • 网站建设永远在路上/百度推广外包哪家不错
  • 工商局网站查询入口/深圳短视频推广
  • 高端品牌网站建设服务/怎么搭建一个网站
  • 东山县城乡规划建设局网站/营销咨询公司排名
  • 长沙正规企业网站制作平台/搜索引擎营销的模式有哪些