Advertisement

算法题15 二叉树的最长的路径长度&&最大路径和

阅读量:

题目

考虑任意一棵二叉树,在其中任何一对节点间必定存在一条通路,并假设相邻层之间的距离设定为单位1的情况下,请计算该二叉树中两两节点之间最长通路的长度。

分析

这类问题可以通过动态规划方法高效解决。具体来说,在任何给定的树结构中,从某个特定节点node出发至其所在子树的所有叶子节点的距离被定义为len(node),那么该路径的最大长度必定会穿过该子树中的一个根节点high_node。

则从该最高节点到其最低叶节点的距离为distance= max(distance(left), distance(right)) + 1,
路径总长为sum= distance(left) + distance(right) + 2;

代码

复制代码
     1intint max)
     2{
     3ifNULL)
     4    {
     5return0;
     6    }
     7 8int00;
     9ifNULL)
    10    {   
    111;
    12    }
    13ifNULL)
    14    {   
    151;
    16    }
    1718int2;
    19max:sum;
    2021returnleft_len:right_len;
    22

最大路径和问题

最大路径问题(最长路径问题指的是寻找两个节点间经过的所有节点的权值总和最大的路线)。这个题目与上一题十分相似,只不过将原本基于边的单位长度转换成了顶点上的权重。

同样地,在给定一个节点node的情况下,该节点node到其最近的叶子节点的距离等于sum(node);因此,所求最长路径必定会经过一个最高点high_node

其向下延伸至最底层叶子节点的总深度等于该节点左右子树的最大深度之和再加一。
路径总长度等于左子树深度加上右子树深度再加上当前节点值。

复制代码
     1intint maxsum)
     2{
     3intvalue;
     4ifNULL)
     5    {
     6return val;
     7    }
     8 9int00;
    10ifNULL)
    11    {   
    12val;
    13    }
    14ifNULL)
    15    {   
    16val;
    17    }
    1819intval;
    20maxsum:sum;
    2122returnleft:right;
    2324

全部评论 (0)

还没有任何评论哟~