数据结构与算法-- 二叉树中和为某一值的路径

二叉树中和为某一值的路径

  • 题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为给定值的所有路径。从树的根节点开始往下一只到叶子节点所经过的节点形成一条路径。
  • 我们用二叉树节点的定义沿用之前文章中 二叉查找树实现原理定义。如下:
public class BinaryNode implements Comparable {private Object element;private BinaryNode left;private BinaryNode right;private int count;
  • 案例:输入如下图中二叉树和整数22,打印出两条路径,第一条包含节点10, 12,第二条包含10,5,7

在这里插入图片描述

  • 二叉树的节点定义中,我们是无法得到树的路径这个概念值的,应为二叉树中并没有介绍树的路径的数据结构,因此对于大多数人而言,这个是一个新的理论模型,也就很难一下找到思路,我们从一个案例入手更加简单,还是用上面的案例:
  • 由于路径就是根节点出发到叶子节点,也就是说路径总是以根节点为起点,因此是先根遍历,也就是我们可以用二叉树的前序遍历,根,左,右的遍历方式,在我之前的文章 数据结构与算法–二叉树实现原理 中详细介绍了三种遍历方式并附带源码,我们以前序遍历为思路解这个问题。
  • 按前序遍历范问上图,10,5,4,7,12 是前序遍历的顺序,我们可以从二叉树结构中看到,没有指向父节点的指针,因此范问5 的时候并不知道10 节点的路径和值,因此我们需要把上一个节点经过的路径保存下来,每次范问一个节点都将当前节点的路径添加到下一个节点的路径中,因此到达5 时候,因存 10,5接着到大4,总和为9 != 22.因此返回5节点,到达7 ,和为 10+5+7 = 22 符合提议,接着返回10 ,访问12,10+12 = 22 符合题意,因此有两组解
  • 按如上分析有如下步骤:
    • 安前序遍历递归实现二叉树的遍历
    • 范问每个子节点之前将本节点走过的路径path和 路径和count传递给需要范问的子节点
    • 字节点范问之前将父节点路径path添加上自己的路径 path+element,路径和添加自己的节点权重 path+weight
    • 如果范问节点没有子节点,则比较路径和count 是否和目标 值一致,一致则正解。
    • 如下实现,此处构造二叉树的方法沿用之前文章:数据结构与算法–二叉查找树实现原理中方法
/*** 二叉树中查找和为n 的路径** @author liaojiamin* @Date:Created in 10:51 2021/5/17*/
public class FindPathInBinary {public static boolean findPath(BinaryNode binaryNode, Integer target) {List<Integer> list = new ArrayList<>();list.add(Integer.valueOf(binaryNode.getElement().toString()));Integer count = Integer.valueOf(binaryNode.getElement().toString());return findPath(binaryNode, list, count, target);}public static boolean findPath(BinaryNode binaryNode, List<Integer> beforePath, Integer beforeCount, Integer target) {if (binaryNode.getLeft() == null && binaryNode.getRight() == null) {printPath(beforePath);System.out.println("beforeCount:" + beforeCount);if(beforeCount == target){System.out.print("存在路径:");printPath(beforePath);System.out.println();}return false;}if (binaryNode.getLeft() != null) {BinaryNode left = binaryNode.getLeft();Integer count = beforeCount + Integer.valueOf(left.getElement().toString());List<Integer> list = new ArrayList<>();list.addAll(beforePath);list.add(Integer.valueOf(left.getElement().toString()));findPath(binaryNode.getLeft(), list, count, target);}if(binaryNode.getRight() != null){BinaryNode right = binaryNode.getRight();Integer count =  beforeCount + Integer.valueOf(right.getElement().toString());List<Integer> list = new ArrayList<>();list.addAll(beforePath);list.add(Integer.valueOf(right.getElement().toString()));findPath(binaryNode.getRight(), list, count, target);}return false;}public static void printPath(List<Integer> objectList) {for (Object o : objectList) {System.out.print(o);System.out.print(",");}}public static void main(String[] args) {
//        Integer arr[] = new Integer[]{44,94,92,23,42,13,7,76,70,40,78,28,78,36,14,53,10,91,36,15};Integer arr[] = new Integer[]{10,5,4,7,12};BinaryNode node = new BinaryNode(null, null, null);BinarySearchTree searchTree = new BinarySearchTree();for (int i = 0; i < arr.length; i++) {int num = arr[i];node = searchTree.insert(num, node);System.out.print(num+",");}System.out.println();System.out.println();findPath(node, 22);}}
  • 该问题考察的是二叉树遍历的变种,考察复杂问题的思维能力,当一下没有思路,我们可以从具体案例开始分析,这样就能找出其中规律

上一篇:数据结构与算法-- 二叉树后续遍历序列校验
下一篇:数据结构与算法–复杂链表的复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310391.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务统计,分析,图表,监控, 分布式追踪一体化的 HttpReports 在 .Net Core 的应用...

前言介绍HttpReports 是针对.Net Core 开发的轻量级APM系统&#xff0c;基于MIT开源协议, 使用HttpReports可以快速搭建.Net Core环境下统计,分析,图表,监控&#xff0c;分布式追踪一体化的站点&#xff0c; 适应.Net Core WebAPI,MVC&#xff0c;Web项目, 通过引用Nuget构建Da…

WPF 创建自定义面板

前面两个章节分别介绍了两个自定义控件:自定义的ColorPicker和FlipPanel控件。接下来介绍派生自定义面板以及构建自定义绘图控件。创建自定义面板是一种特殊但较常见的自定义控件开发子集。前面以及介绍过有关面板方面的知识&#xff0c;了解到面板驻留一个或多个子元素&#x…

vue.js中mock本地json数据

vue.js中mock本地json数据 新版本的vue项目中已经将dev-server.js&#xff0c;dev-client.js两个js文件合并到了webpack.dev.conf.js文件中&#xff0c;以下分别是新旧版本的build目录结构&#xff1a; 新版本&#xff1a; 旧版本&#xff1a; 本次验证mock&#xff1a;运…

互联网40岁失业是一个无法打破的魔咒吗?

最近刚刚过完生日&#xff0c;又大了一岁&#xff0c;距离40岁又进了一步。年纪大了&#xff0c;就要多复盘。最近几天思考的比较多&#xff0c;因为身边失业的朋友开始多了起来。我又有点陷入担忧、焦虑的心态了。好在我一直是个有阿Q精神的中年油腻男&#xff0c;很快安抚好自…

数据结构与算法--复杂链表的复制

复杂链表的复制 题目&#xff1a;实现一个函数complexListNode 复制一个复杂链表。在链表中&#xff0c;每个节点除了有一个next指针指向下一个节点&#xff0c;还有另外一个before节点&#xff0c;before节点指向链表中任意一个节点&#xff0c;或者null节点。链表节点定义使…

如何实时主动监控你的网站接口是否挂掉并及时报警

“ 阅读本文大概需要 10 分钟。 ”最近我在公司负责的业务已经正式投入上线了&#xff0c;既然是线上环境&#xff0c;那么就需要保证其可用性。我负责的业务其中就包括一个 Web Service&#xff0c;我需要保证 Service 的每个接口都是可用的&#xff0c;如果某个时间流量大了或…

数据结构与算法--二叉查找树转顺序排列双向链表

二叉查找树转顺序排列双向链表 题目&#xff1a;输入一颗二叉查找树&#xff0c;将二叉查找树转成一个排序的双向链表&#xff0c;要求不能创建任何新节点&#xff0c;只调整树节点中指针的指向。例如下图所示&#xff1a; 本次二叉查找树节点定义使用之前文章 数据结构与算法…

5种避免C#.NET中因事件造成内存泄漏的技术

原文来自互联网&#xff0c;由长沙DotNET技术社区编译。 5种避免C&#xff03;.NET中事件造成的内存泄漏的技术C&#xff03;&#xff08;通常是.NET&#xff09;中的事件注册是内存泄漏的最常见原因。至少从我的经验来看。实际上&#xff0c;我从事件中看到了太多的内存泄漏&a…

数据结构与算法--字符串的排列组合问题

字符串的全排列 题目&#xff1a;输入一个字符串&#xff0c;打印出改字符串中所有字符的所有排列。例如输入字符串abc&#xff0c;那么打印出由a&#xff0c;b&#xff0c;c字符组成的所有字符串&#xff1a;abc&#xff0c;acb&#xff0c;bac&#xff0c;bca&#xff0c;cab…

[GitHub] 75+的 C# 数据结构和算法实现

C#中标准数据结构和算法的即插即用类库项目GitHub&#xff1a;https://github.com/aalhour/C-Sharp-AlgorithmsWatch: 307 Star: 3.4k Fork: 910o---o | |/ --O---O--O | |\ --O---O--o---o | |O o o--o o--o o---o o-O-o …

我是如何一步步的在并行编程中将lock锁次数降到最低实现无锁编程

在并行编程中&#xff0c;经常会遇到多线程间操作共享集合的问题&#xff0c;很多时候大家都很难逃避这个问题做到一种无锁编程状态&#xff0c;你也知道一旦给共享集合套上lock之后&#xff0c;并发和伸缩能力往往会造成很大影响&#xff0c;这篇就来谈谈如何尽可能的减少lock…

常用Arthas命令

jad反编译 检查线上代码是否修改成功&#xff0c;例如修改interface后看Jar包是否引入新的&#xff0c;或者代码是否最新的。 jad com.zhenai.counseling.business.provider.facade.supremecourse.RedeemRecordFacadeImpl //反编译只展示源码 jad --source-only com.zhenai.c…

关于分布式锁的面试题都在这里了

「我今天班儿都没上&#xff0c;就为了赶紧把这篇文章分布式锁早点写完。我真的不能再贴心了。」「边喝茶边构思&#xff0c;你们可不要白嫖了&#xff01;三连来一遍&#xff1f;」引言为什么要学习分布式锁&#xff1f;最简单的理由就是作为一个社招程序员&#xff0c;面试的…