Leetcode.687 最长同值路径 中等
要求的是最长的路径,那我们把每条路径都找出来,然后更新保存最长的即可
首先路径问题应该能想到使用深度优先搜索(DFS),DFS的基础结构如下:
DFS( TreeNode *Node)
{
if(root == NULL)
return;
DFS(root.left);
DFS(root.right);
}
只需要在此基础上添加我们所需要的判断就行,对于一个root节点,我们要找到它的左分支的最长同值路径
leftMaxVal和右分支的最长同值路径rightMaxVal,这时leftMaxVal + rightMaxVal就是这个root节点的最长同值路
径,将这个路径长度与我们的最终答案比较,如果比res大,就更新res。然后返回max(leftMaxVal,
rightMaxVal),用于此root节点的父节点的判断。
class Solution {
private:
int res = 0;//记录答案
public:
int longestUnivaluePath(TreeNode* root) {
if(root == NULL) return 0;
DFS(root);//DFS
return res;
}
int DFS(TreeNode* tree)
{
if(tree == NULL) return 0;
//左分支
int left = DFS(tree->left);
//右分支
int right = DFS(tree->right);
int l = 0,r = 0;
//判断是否是同值
if(tree->left && tree->left->val == tree->val)
l = left+1;
if(tree->right && tree->right->val == tree->val)
r = right+1;
//更新路径最大值
res = max(res,l+r);
//返回最大的同值分支,方便上一级的计算
return max(l,r);
}
};
DFS是比较熟悉的,就是递归判断的时候还是不太清晰,得想半天,还得加强这种类型的题的练习。