

还是典型的双重dfs,先用第一层dfs搜索到每个点,然后对每个点进行dfs,第二层dfs的内容是判断和根的值是否相同,如果相同就加上当前结点的深度,并且计算当前左右子树能提供的最大深度+1。如果不相等,直接返回0。
第一层dfs中对每个结点再次进行dfs的内容的时传进自身的值的左右结点,用左+右来更新res。
class Solution {
public:
int dfs2(TreeNode* root,int val){
if(root == nullptr) return 0;
int res = 0;
//这里很重要,val是上一层的,如果和上一层的值相等就先+1,然后判断左右,传入的val还是上一层的
if(root->val == val){
res+=1;
return max(dfs2(root->left,val) , dfs2(root->right,val)) + res;
}
//一开始就是这里写错了,如果不等于直接返回0!!必须要明确写出
return 0;
}
void dfs1(TreeNode* root){
if(root == nullptr) return;
//对每个点再次进行dfs
//用当前结点的左右能提供的深度和来更新res
res = max(dfs2(root->left,root->val)+dfs2(root->right,root->val),res);
//别忘记第一层递归
dfs1(root->left);
dfs1(root->right);
}
int longestUnivaluePath(TreeNode* root) {
//和直径相同,但是要结点的值相等
//判断当前点的左右可以提供给自己最长的路径长度,双重dfs
if(root == nullptr) return 0;
dfs1(root);
return res;
}
private:
int res = 0;
};
二叉树双重DFS算法解析

博客介绍了典型的二叉树双重DFS算法。第一层DFS搜索每个点,第二层DFS判断与根值是否相同,相同则加当前结点深度并计算左右子树最大深度加1,不同则返回0。在第一层DFS中对每个结点的左右结点进行操作,用左加右更新结果。
217

被折叠的 条评论
为什么被折叠?



