Posts 【算法解忧】求二叉树各路径结点之和并找出最大值的路径
Post
Cancel

【算法解忧】求二叉树各路径结点之和并找出最大值的路径

求二叉树各路径结点之和并找出最大值的路径

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

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

事件背景

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

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

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

Case

1
2
3
4
5
    1
   / \
  2   3
 /\
4  5

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

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

1
[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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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<integer,string> treeMap = new TreeMap<integer, string>();


    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();
        }
    }
}

This post is licensed under CC BY 4.0 by the author.