【二叉树/动态规划】Leetcode 543.二叉树的直径

 题目链接

解题思路

        首先,容易得出,所求直径两端的节点一定为叶子节点。这一点用反证法即可证明,假设直径端点为一个非叶子节点,那么他的子节点一定是一个更优端点。

        根据题意,在计算直径上溯时,一定会出现唯一的最浅节点。由于题目特意说明了最浅节点并不一定是根节点,所以理论上二叉树中所有节点都可以作为这个最浅节点。(即便是叶节点也可以认为它有2个地址为nullptr的子节点)假如给定一个确定的最浅节点,那么存在唯一“直径”,即存在唯一“一个叶节点经过该最浅节点再到另一个叶节点的路径和的最大值”。也就是说,只要计算出二叉树中所有的节点作为“最浅节点”的“直径”,求该集合中的最大值即可。

        到这里其实就可以发现,求解一个父节点的“直径”,其子问题是求解这个父节点的子节点的“直径”,因此这道题可以用动态规划的思想解决,再结合递归和二叉树前序遍历,具体步骤如下:

int ans = 0;
int depth(TreeNode* root)          //返回值为节点与最深节点深度之差
{
	if(root == nullptr)            //如果到达边界
		return 0;                  //返回与最深节点之差为0
	int L = findRoot(root->left);  //求当前节点与左路径下最深节点距离差
	int R = findRoot(root->right); //求当前节点与右路径下最深节点距离差
	ans = max(L + R, ans);         //求当前节点直径长度
	return max(L, R) + 1;          //返回当前节点深度
}

完整代码

class Solution
{
	int ans = 0;
	int depth(TreeNode* root)
	{
		if(root == nullptr)
			return 0;
		int L = findRoot(root->left);
		int R = findRoot(root->right);
		ans = max(L + R, ans);
		return max(L, R) + 1;
	}
		
public:
    int diameterOfBinaryTree(TreeNode* root) 
	{
		if(root->left == nullptr && root->right == nullptr)
			return 0;
		ans = depth(root);
		return ans;
	}
};
  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Andy_Xie007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值