轻松解决三种二叉树的最大路径和问题

目录

一、概述

二、二叉树的最大路径和

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;
}

猜你喜欢

转载自blog.csdn.net/kupe87826/article/details/105953358