543. Diameter of Binary Tree
题干简述:
求解一个二叉树的最大直径。
直径:该树两节点之间路径长度。这里的路径可以不经过根结点。
解题思路
这一题,看似有点麻烦,其实它的本质还是很简单的,也就是二叉树结点的高度求解。为什么它的本质是二叉树的高度求解呢?我们可以一点一点的来推导。
算法的求解其实就是数学问题的求解,所谓的推导,也就是一步步的寻找并发现规律。这里,我们不要一开始就从根结点 root 开始推导,那会有很多种情况,越推越复杂。
如图所示,一个二叉树,从其叶子结点开始倒推,基础只会有4种,分别是单个结点(无子树),仅有一个子树,拥有左右子树;对比他们的直径和高度,我们可以初步总结出一个规律,一个结点的最大直径 = 左右子树最大高度之和。所有的二叉树,都是由以上几种结点组成,这个结论同样适用。
在得出上述公式之后,我们要做的事情就跃然于纸上了,计算结点的最大高度。如何计算高度,欢迎去看我的另一篇题解 110. Balanced Binary Tree,这里我们需要做的额外处理是对比结点的左右子树高度,返回其中最大值。在计算高度的过程中,我们也需要同步去更新我们的最终结果,这样才能保证在递归的过程中,确保最终结果是正确的。
题解
/**
* 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 max = 0;
const getDepth = (node) => {
if (!node) return 0;
const leftDepth = getDepth(node.left);
const rightDepth = getDepth(node.right);
max = Math.max(max, leftDepth + rightDepth);
return Math.max(leftDepth, rightDepth) + 1;
};
getDepth(root);
return max;
};
Q.E.D.