[前端]_一起刷leetcode 543. 二叉树的直径

224 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

题目:

543. 二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。

示例 : 给定二叉树

示例 :

          1
         / \
        2   3
       / \     
      4   5  

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

 

注意: 两结点之间的路径长度是以它们之间边的数目表示。

思路:

  • 设计到树结构,啥也不说先写个递归,不清楚的可以看一下我之前的文章二叉树入门教程juejin.cn/post/702785…
  • 这道题目可能看起来比较复杂,实际上可以转化为求每个节点的左右两个节点的最长路径
  • 写个方法求某个节点的左右路径最大值之和、以及当前节点的最长路径(左或者右)

实现:

/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
*     this.val = (val===undefined ? 0 : val)
*     this.left = (left===undefined ? null : left)
*     this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function(root) {
  // 递归问题直接把根节点抛进去就好了
  let { maxValue } = findNodeMaxPath(root)
  return maxValue;
};

var findNodeMaxPath = function(node, maxValue = 0) {
  // 如果没有子节点就不用算了
  if (!node) {
      return { maxValue, maxCount: 0 };
  }

  // 把求解的路径交给左右两个节点去递归计算
  let leftMax = findNodeMaxPath(node.left, maxValue);
  let rightMax = findNodeMaxPath(node.right, maxValue);

  // 比较每个节点的最长路径
  maxValue = Math.max(
      ...[leftMax.maxValue, rightMax.maxValue, leftMax.maxCount + rightMax.maxCount]
  );
  // 记录每个节点的最长边, 给父节点使用
  maxCount = Math.max(leftMax.maxCount, rightMax.maxCount) + 1;
  return { maxValue, maxCount };
}

总结:

这道题目看懂题目就简单了很多,求两个节点的最长路径,其实就是求某个节点的左右路径之和。想明白了这一步,写个方法求和然后递归树节点去执行就完事了。

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。