zoukankan      html  css  js  c++  java
  • 算法题15 二叉树的最长的路径长度&&最大路径和

    题目

      给定一个二叉树,任意两个节点之间必然是有一条路径相通的,假定父节点和它的孩子节点的距离为单位1,求二叉树中相距最远的两个节点间的路径长度

    分析

      这是一个简单的动态规划问题,假设某个节点node,到它的最低叶节点的长度为len(node),所求的最长路径必然经过一个最高节点high_node,

    则它到最低叶节点的长度为len(high_node)=max(len(high_node->left),len(high_node->right))+1,路径长度为sum=len(high_node->left)+len(high_node->right)+2;

    代码

     1 int MaxDistance(TreeNode* root,int* max)
     2 {
     3     if (root->pLeft==NULL&&root->pRight==NULL)
     4     {
     5         return 0;
     6     }
     7 
     8     int left_len=0,right_len=0;
     9     if (root->pLeft!=NULL)
    10     {   
    11         left_len=MaxDistance(root->pLeft,max)+1;
    12     }
    13     if (root->pRight!=NULL)
    14     {   
    15         right_len=MaxDistance(root->pRight,max)+1;
    16     }
    17 
    18     int sum=left_len+right_len+2;
    19     *max=(*max>sum)?*max:sum;
    20 
    21     return (left_len>right_len)?left_len:right_len;
    22 }

    最大路径和问题

      下面再看最大路径和问题(路径和为两个节点之间所在路径上的节点权值之和)。这个问题和上题非常相似,只不过是把单位距离换成了节点上的权值而已。

    同样,假设某个节点node,到它的最低叶节点的长度为sum(node),所求的最长路径必然经过一个最高节点high_node,

    则它到最低叶节点的长度为sum(high_node)=max(sum(high_node->left),sum(high_node->right))+high_node->value,路径和path_sum=sum(high_node->left)+sum(high_node->right)+high_node->value;

     1 int MaxPathSum(TreeNode* root,int* maxsum)
     2 {
     3     int val=root->value;
     4     if (root->pLeft==NULL&&root->pRight==NULL)
     5     {
     6         return val;
     7     }
     8 
     9     int left=0,right=0;
    10     if (root->pLeft!=NULL)
    11     {   
    12         left=MaxPathSum(root->pLeft,maxsum)+val;
    13     }
    14     if (root->pRight!=NULL)
    15     {   
    16         right=MaxPathSum(root->pRight,maxsum)+val;
    17     }
    18 
    19     int sum=left+right-val;
    20     *maxsum=(*maxsum>sum)?*maxsum:sum;
    21 
    22     return (left>right)?left:right;
    23 
    24 }
  • 相关阅读:
    11. Container With Most Water
    9. Palindrome Number
    375. 猜数字大小 II leetcode java
    leetcode 72 编辑距离 JAVA
    73. 矩阵置零 leetcode JAVA
    快速排序 JAVA实现
    63. 不同路径 II leetcode JAVA
    重写(override)与重载(overload)
    62 不同路径 leetcode JAVA
    leetcode 56 合并区间 JAVA
  • 原文地址:https://www.cnblogs.com/wangzaizhen/p/5179729.html
Copyright © 2011-2022 走看看