动画:面试必刷之二叉树中和为某一值的路径

作者 |  小鹿

来源 |  小鹿动画学编程

题目

输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输出整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径。

如图:

题目分析

要想知道二叉树的某一路径和是否等于一个整数,那么首先要全部列举出所有路径和,然一一对比找出满足条件的路径。

那么什么方法可以遍历出二叉树所有路径的情况呢?我们第一可能想到的是二叉树的三种遍历方式,前、中、后遍历,因为我们路径和是从根到叶子节点的,通过这个特点,我们可以一下子定位到前序遍历的顺序特点(根、左、右),遍历规律从根到叶子节点逐个进行递归遍历,符合我们所分析的。

通过上方我们选择前序遍历来进行求路径和。我们可以声明一个数组,每遍历一个节点,我们就推进数组,当遇到根节点时,我们就将数组求和,判断是否等于我们的目标值,如果不相等,我们就返回上一个节点,同时数组中的数据出栈一个,然后将下一个遍历到的节点加入到数组中。

这种“先进先出”的特点让我们想到了一个数据结构就是“栈”,没错,我们正是用这种结构来进行解决此题。

动画实现

解题思路

首先,用户输入当前树和整数值,我们要进行判断。

    // 判断当前树和值是否为正常值
    if(root == null || value < 0){
        return false;
    }

然后我们开始声明用到的一些变量,比如路径栈、符合条件的路径存储数组以及当前累积的值。

    // 声明变量
    let pathStack = [],
        currentSum = 0,
        result = [];

开始遍历路径,整体的逻辑思路俺已经整理好。首先我们拿到当前节点,我们要把当前节点的值入栈,然后判断栈内的和是否等于我们输入的整数值且当前节点为叶子节点。如果是,则将路径输出到结果集中,否则,继续进行对当前节点的左右子树往下递归,如果遇到叶子节点,且当前的值不符合条件,我们就出栈,返回上一个节点继续进行递归。

// 遍历路径
const FindPath = (root, value, currentSum, pathStack, result)=>{
    // 累加
    currentSum = currentSum + root.val;

    // 入栈
    pathStack.push(root.val);

    // 判断是否等于目标值且为叶子节点
    if(currentSum == value && root.left == null && root.rigth == null){
        result = pathStack;
        return result;
    }

    // 如果不是,则判断是有子节点进行递归
    if(root.left !== null){
        FindPath(root.left, value, currentSum, pathStack, result);
    }

    if(root.rigth !== null){
        FindPath(root.rigth, value, currentSum, pathStack, result);
    }

    // 递归出栈
    pathStack.pop();
}

代码实现

JavaScript

Java

Python

测试用例

  • 完全二叉树、非完全二叉树(有一条路径满足、有多条路径满足、都不满足)—— 普通测试

  • 只有左子节点的二叉树、只有右子节点的二叉树、只有一个结点的二叉树 —— 特殊测试

  • 空二叉树、输入负数 —— 输入测试

------  END  ---------

最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。关注公众号并回复 888 领取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值