輕鬆解決三種二叉樹的最大路徑和問題

目錄

一、概述

二、二叉樹的最大路徑和

1、二叉樹的最大路徑和(root->leaf)

2、二叉樹的最大路徑和(root->any)

3、二叉樹中的最大路徑和(any->any)


一、概述

     在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章