题目
解题总结
又是一道不会做的题。
我的思路是,每一个节点作为根节点,找到左右子树最长路径,相加起来,就是经过该节点的最长路径。 再从中找到最长的那一个。
代码如下:
/**
* @param {TreeNode} root
* @return {number}
*/
var diameterOfBinaryTree = function(root) {
let maxDis=(root, len)=>{
if(!root) return len;
const leftLen = (root.left ? maxDis(root.left, len) : len);
const rightLen = (root.right ? maxDis(root.right, len) : len);
return 1 + Math.max(rightLen, leftLen) ;
}
let rootLen = [];
// 遍历每一个节点
let traverseNode = (root)=>{
if(!root) return;
// 找到每一个节点最长路径
rootLen.push(maxDis(root.left,0) + maxDis(root.right,0));
traverseNode(root.left);
traverseNode(root.right);
}
traverseNode(root);
return rootLen.sort().pop();
};
分析:
啊啊啊啊,我的想法没有错,所以到底是哪里错了呢?
因为!JS中 sort 的默认排序规则是:
默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。
举个例子:
let a = [8,18,5,15];
a.sort();
//输出为:[15, 18, 5, 8]
如果想让他按数字排序:
a.sort((a,b)=>a-b);
我真的,裂开,真的,裂开中的裂开,我本来二十分钟就能搞出来的题目,因为这个,让我怀疑人生。呵!气死,sort,我记住你了!!!
至于代码的优化,等我回家平复一下心情再写,哼!生气!