Exemplo n.º 1
0
        /*

         题目: 树中最大路径和
         难度: Easy
         链接: http://www.itint5.com/oj/#13
         问题:
         给定一棵树的根结点,树中每个结点都包含一个整数值val。
         我们知道树中任意2个结点之间都存在唯一的一条路径,路径值为路径上所有结点值之和。
         请计算最大的路径值(允许路径为空)。
         样例:
            -10
          /  |  \
         2   3   4
            / \
           5  -1
              /
             6
            /
           -1
         最大的路径值为13,相应的路径为5到6之间的路径。
         扩展:此题算法也可用来解决另一个非常常见的面试题“树的直径”(求树中任意两结点路径的长度的最大值)。
         可以认为树中每个结点的val值为1,那么求最长路径相当于求路径值最大的路径。
         Solution: LeetCode中Binary Tree Maximum Path Sum的扩展,这里是树,而非二叉树。
         code source from blog:
         https://github.com/AnnieKim/ITint5/blob/master/013_%E6%A0%91%E4%B8%AD%E6%9C%80%E5%A4%A7%E8%B7%AF%E5%BE%84%E5%92%8C.cpp
        */
        public static int maxTreePathSumRe(TreeNode root, ref int res)
        {
            if (root == null) return res;

            int N = (root.children==null)?0:root.children.Length;

            // julia added comment: need to find maximum path through the root node,
            // so, multiple children, only keep first two most biggest pathes.
            // For the test case, root.val = -10, there are 3 children, each has maximum path length through the root node: 2, 8, 4
            // so, the consideration is first 2 largest path length, 8 and 4.
            // -10 + 8 +4
            // yeah, through the debug, she knows the idea.
            int first = 0, second = 0;

            for (int i = 0; i < N; ++i)
            {
                TreeNode[] a = root.children;
                TreeNode b = (TreeNode)a[i];

                int sum = maxTreePathSumRe(b, ref res);
                if (sum > first) {
                    second = first;
                    first = sum;
                } else if (sum > second) {
                    second = sum;
                }
            }

            int maximum = root.val;
            maximum = max(maximum, root.val + first);
            res = max(res, maximum);
            res = max(res, root.val + first + second);
            return maximum;
        }
Exemplo n.º 2
0
        public static int maxTreePathSum(TreeNode root)
        {
            int res = 0;

            maxTreePathSumRe(root, ref res);

            return res;
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            /*
             * Test case:
             *
                    -10
                  /  |  \
                 2   3   4
                    / \
                   5  -1
                      /
                     6
                    /
                   -1
             * Maximum path sum: 5-> 3-> -1-> 6 , result is 13
             */
            TreeNode n1 = new TreeNode(-10);
            n1.children = new TreeNode[3];

            n1.children[0] = new TreeNode(2);
            n1.children[1] = new TreeNode(3);
            n1.children[2] = new TreeNode(4);

            TreeNode l2 = n1.children[1];
            l2.children = new TreeNode[2];
            l2.children[0] = new TreeNode(5);
            l2.children[1] = new TreeNode(-1);

            TreeNode l3 = l2.children[1];
            l3.children = new TreeNode[1];
            l3.children[0] = new TreeNode(6);
            l3.children[0].children = new TreeNode[1];
            l3.children[0].children[0] = new TreeNode(-1);

            int result = maxTreePathSum(n1);
        }