「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战」
题目
给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。 注意:两个节点之间的路径长度由它们之间的边数表示。
示例1
5
/ \
4 5
/ \ \
1 1 5
输出: 2
注意: 给定的二叉树不超过10000个结点。 树的高度不超过1000。
题解
在leetcode上,递归能解决二叉树90%的题;
这题最容易想到的思路就是递归,
想到递归,需要考虑返回递归返回什么?
对于任意节点node
- 如果节点为空,向上级节点返回0,因为此时当前节点的【最长的路径】就是0;
- 如果节点不为空,递归获取节点左侧、右侧子节点【最长的路径】,这点比较重要,因为是这是递归的开始,获取的是节点的【最长路径】,所以此函数最后返回的一定是一个数值,数值表示节点得到的【最长路径】
- 如果当前节点node的value值与当前节点的左侧子节点value值(node.left.value)相同,将获取到的当前左侧子节点【最长的路径+1保存到leftMax变量中,这个变量后期有重要用处。
- 如果当前节点node的value值与当前节点的右侧子节点value值(node.right.value)相同,将获取到的当前右侧子节点【最长的路径】+1保存到rightMax变量中;
- 从变量leftMax和rightMax中找到较大值。讲这个较大值返回到当前节点node的上级,作为node节点上级的子节点【最长的路径】
- 在计算子节点【最长的路径】的递归算法中,同步保存计算到的子节点【最长的路径】最大值,保存到结果result变量
- 返回result这个变量即可
graph TD
mid --> Left & Right
代码
var longestUnivaluePath = function(root) {
let resule = 0
getVal(root)
function getVal(node){
if (node == null) return 0;
let left = getVal(node.left)
let right = getVal(node.right)
let leftMax = 0
let rightMax = 0;
if(node.left != null && node.left.val == node.val){
leftMax+=left+1
}
if (node.right != null && node.right.val == node.val) {
rightMax += right + 1;
}
resule = Math.max(resule, leftMax + rightMax);
return Math.max(leftMax, rightMax);
}
return resule
};