二叉树的最长的路径长度最大路径和
題目
給定一個二叉樹,任意兩個節(jié)點(diǎn)之間必然是有一條路徑相通的,假定父節(jié)點(diǎn)和它的孩子節(jié)點(diǎn)的距離為單位1,求二叉樹中相距最遠(yuǎn)的兩個節(jié)點(diǎn)間的路徑長度
分析
這是一個簡單的動態(tài)規(guī)劃問題,假設(shè)某個節(jié)點(diǎn)node,到它的最低葉節(jié)點(diǎn)的長度為len(node),所求的最長路徑必然經(jīng)過一個最高節(jié)點(diǎn)high_node,
則它到最低葉節(jié)點(diǎn)的長度為len(high_node)=max(len(high_node->left),len(high_node->right))+1,路徑長度為sum=len(high_node->left)+len(high_node->right)+2;
代碼
int MaxDistance(TreeNode* root,int* max) {if (root->pLeft==NULL&&root->pRight==NULL){return 0;}int left_len=0,right_len=0;if (root->pLeft!=NULL){left_len=MaxDistance(root->pLeft,max)+1;}if (root->pRight!=NULL){right_len=MaxDistance(root->pRight,max)+1;}int sum=left_len+right_len+2;*max=(*max>sum)?*max:sum;return (left_len>right_len)?left_len:right_len; }最大路徑和問題
下面再看最大路徑和問題(路徑和為兩個節(jié)點(diǎn)之間所在路徑上的節(jié)點(diǎn)權(quán)值之和)。這個問題和上題非常相似,只不過是把單位距離換成了節(jié)點(diǎn)上的權(quán)值而已。
同樣,假設(shè)某個節(jié)點(diǎn)node,到它的最低葉節(jié)點(diǎn)的長度為sum(node),所求的最長路徑必然經(jīng)過一個最高節(jié)點(diǎn)high_node,
則它到最低葉節(jié)點(diǎn)的長度為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;
int MaxPathSum(TreeNode* root,int* maxsum) {int val=root->value;if (root->pLeft==NULL&&root->pRight==NULL){return val;}int left=0,right=0;if (root->pLeft!=NULL){left=MaxPathSum(root->pLeft,maxsum)+val;}if (root->pRight!=NULL){right=MaxPathSum(root->pRight,maxsum)+val;}int sum=left+right-val;*maxsum=(*maxsum>sum)?*maxsum:sum;return (left>right)?left:right;}?
總結(jié)
以上是生活随笔為你收集整理的二叉树的最长的路径长度最大路径和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二叉树的遍历 (递归和非递归实现)
- 下一篇: 什么是堆(Heap)