看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
给定一个二叉树的 root ,返回 最长的路径的长度 ,这个路径中的 每个节点具有相同值 。 这条路径可以经过也可以不经过根节点。
两个节点之间的路径长度 由它们之间的边数表示。
示例 1:
输入: root = [5,4,5,1,1,5]
输出: 2
示例 2:
输入: root = [1,4,5,4,4,5]
输出: 2
提示:
- 树的节点数的范围是
[0, 104] -1000 <= Node.val <= 1000- 树的深度将不超过
1000
解题思路
- 对于当前节点,左子树能提供的长度为
l,如果当前节点值等于左子节点的值,则左链的长度等于l+1,否则为0 - 对于当前节点,右子树能提供的长度为
r,如果当前节点值等于右子节点的值,则右链的长度等于r+1,否则为0 - 当前子树对父节点提供的最大长度为左右链中较大的一个
- 当前子树的左右链之和,去和全局最大值比较,试图更新它
解题代码
var longestUnivaluePath = function(root) {
let res = 0
const dfs = (node)=>{
if(!node) return 0
const l = dfs(node.left)
const r = dfs(node.right)
let left = 0
let right = 0
if(node.left&&node.left.val == node.val) {left = l+1}
if(node.right&&node.right.val == node.val){right = r+1}
res = Math.max(res,left+right)
return Math.max(left,right)
}
dfs(root)
return res
};
如有任何问题或建议,欢迎留言讨论!