目錄
一、概述
在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。
一棵深度爲k,且有2^k-1個結點的二叉樹,稱爲滿二叉樹。這種樹的特點是每一層上的結點數都是最大結點數。而在一棵二叉樹中,除最後一層外,若其餘層都是滿的,並且或者最後一層是滿的,或者是在右邊缺少連續若干結點,則此二叉樹爲完全二叉樹。具有n個結點的完全二叉樹的深度爲floor(log2n)+1。深度爲k的完全二叉樹,至少有2k-1個葉子結點,至多有2k-1個結點。
二、二叉樹的最大路徑和
1、二叉樹的最大路徑和(root->leaf)
可以採用遞歸divide-conquer方法求解,root到leaf,可以設想一下這個路徑,從root出發左邊大我就加左邊,右邊大我就加右邊一直到leaf。大家寫算法一定要有相應的圖解。
//root to leaf
int maxPathSum(BTNode* root)
{
if (root == NULL)
return 0;
int left = maxPathSum(root->left);
int right = maxPathSum(root->right);
return std::max(left, right) + root->val;
}
2、二叉樹的最大路徑和(root->any)
同樣的方法求解,root到any,可以設想一下這個路徑,從root出發左邊大我就加左邊如果左邊小於0也不加,右邊大我就加右邊如果右邊小於0我也不加。
//root to any
int maxPathSum2(BTNode* root)
{
if (root == NULL)
return 0;
int left = maxPathSum2(root->left);
int right = maxPathSum2(root->right);
return std::max(0,std::max(left, right)) + root->val;
}
3、二叉樹中的最大路徑和(any->any)
這個在方法2中加上比較任意節點從左右兩邊到any。大家對比方法2細細體會。
//any to any
int g_maxsum = std::numeric_limits<int>::lowest();
int maxPathSum3(BTNode* root)
{
if (root == NULL)
return 0;
int left = maxPathSum3(root->left);
int right = maxPathSum3(root->right);
int max = root->val;
if (left > 0)
{
max = max + left;
}
if (right > 0)
{
max = max + right;
}
g_maxsum = std::max(g_maxsum,max);//任何節點都可以作爲root
return std::max(0,std::max(left,right))+root->val;
}