题目描述
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。
注意:两个节点之间的路径长度由它们之间的边数表示。
示例 1:
输入:
5
/ \
4 5
/ \ \
1 1 5
输出:
2
示例 2:
输入:
1
/ \
4 5
/ \ \
4 4 5
输出:
2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
思路
这是一道经典的树递归问题,使用后序遍历的dfs,按照如下规则进行递归:
- 设置返回以root为根节点的树的最长同值路径的长度。
- 递归,以每一个节点为根节点进行步骤1 ,并取其中的最大长度。 需注意的是,在1. 操作中,根节点是特殊的;具体的说:若同值路径存在,只有根节点的左儿子 和右儿子可以被同时接入路径;且根节点的父节点不能被接入路径。对于路径中其他节点,最多只有一个子节点被接入路径。
C++代码(详细注释)
class Solution {
public:
int ans = 0;
int longestUnivaluePath(TreeNode* root) {
arrowLength(root);
return ans;
}
int arrowLength(TreeNode* root){//arrowLength返回以root为根节点的单侧最大同值路径的长度
if(!root) return 0;//
int left = arrowLength(root->left);//left存储以root的左孩子为根节点的最大同值路径的长度
int right = arrowLength(root->right);//存储以root的右孩子为根节点的最大同值路径的长度
int arrowLeft = 0, arrowRight = 0;
if(root->left && root->left->val == root->val){//若root的左孩子不为空且左孩子值与root值相等
arrowLeft += left + 1;
}
if(root->right && root->right->val == root->val){//若root的右孩子不为空且右孩子值与root值相等
arrowRight += right + 1;
}
ans = max(ans, arrowLeft + arrowRight);//ans存放步骤(2)的结果
return max(arrowLeft, arrowRight);//保证路径不分叉且取到最大
}
本文正在参与「掘金 3 月闯关活动」,点击查看活动详情。