博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【算法】求二叉树各路径结点之和并找出最大值的路径
阅读量:5169 次
发布时间:2019-06-13

本文共 1656 字,大约阅读时间需要 5 分钟。

 

说在前面的话


 

  最近没事将大学里的《数据结构》(严蔚敏,吴伟民著)一书重拾温习,受益颇多,才发现工作之中诸多经验问题都找到了理论支撑。

  当时觉得没用的书,现在只能嘲笑当时得多low... 现在依然很low... --!

 

 

事件背景


  因实际工作中,遇到一个关于权重的问题,需要将数据关系中最大权重的路径找到,然后就想到了《数据结构》中的DFS...

  此事勾起了我码砖的激情,让我本已平静的心再次荡漾...

  为了简单说明这个问题,我就拿个二叉树的模型来叙述一下我要达成的目标

 

CASE


 

Example:

 

                                

 

  如图所见,一个二叉树,各结点值是int类型,现在要找出各结点之和最大的路径。

      如图可知,此二叉树有三条路径:

      [1,2,4],[1,2,5],[1,3]

  结点之和最大的是[1,2,5],我们最终的目标就是要找到这条路径!

  怎么破?

  

分析

 


 

  找出结点之和最大的路径,我们就不得不遍历二叉树了。

  说到遍历二叉树,我们都知道有先序遍历(DLR),中序遍历(LDR),后序遍历(LRD)。

  这里我们尝试先序遍历,我个人感觉先序遍历比较easy的解决这个问题... 个人感觉...

 

    分析下先序遍历的路径:1->2->4->5->3

      当发现到达叶子结点时,确认一条路径,并将这路径中各结点相加得到sum,然后退回至父结点再次寻找另其它叶子结点,重复之前的操作,并与上次的sum进行比较...

  如此重复下去,直至所有路径都遍历完成,sum保存的就是结点之和最大的值,关键是如何保存sum的路径?

  当然是栈咯...  栈顶叶子结点,栈底根结点,嗯!

 

code


 

public class TreeNode{    private TreeNode leftTree;    private int val;    private TreeNode rightTree;    //Getter and setter.  }

 

 

public class FindPath{    private static Stack
stack = new Stack
(); private static TreeMap
treeMap = new TreeMap
(); public static void findMaxValueOfPath(TreeNode tree){ if(null == tree) return; stack.push(tree); if(tree.getLeftTree() == null && tree.getRightTree() == null){ String s = ""; int sum = 0; for(TreeNode tmp: stack){ s += tmp.getVal() + "->"; sum += tmp.getVal(); } treeMap.put(sum,s); stack.pop(); }else{ findMaxValueOfPath(tree.getLeftTree()); findMaxValueOfPath(tree.getRightTree());        stack.pop(); } }}

 

 

 

 

  

 

转载于:https://www.cnblogs.com/jksmile/p/4401028.html

你可能感兴趣的文章
tableView
查看>>
Happy Great BG-卡精度
查看>>
Xamarin Visual Studio不识别JDK路径
查看>>
菜鸟“抄程序”之道
查看>>
Ubuntu下关闭防火墙
查看>>
TCP/IP 邮件的原理
查看>>
原型设计工具
查看>>
windows下的C++ socket服务器(4)
查看>>
css3 2d转换3d转换以及动画的知识点汇总
查看>>
【Java】使用Eclipse进行远程调试,Linux下开启远程调试
查看>>
计算机改名导致数据库链接的诡异问题
查看>>
Java8内存模型—永久代(PermGen)和元空间(Metaspace)(转)
查看>>
ObjectiveC基础教程(第2版)
查看>>
centos 引导盘
查看>>
Notes of Daily Scrum Meeting(12.8)
查看>>
Apriori算法
查看>>
onlevelwasloaded的调用时机
查看>>
lr_start_transaction/lr_end_transaction事物组合
查看>>
CodeIgniter学习笔记(四)——CI超级对象中的load装载器
查看>>
.NET CLR基本术语
查看>>