题目
给定一个二叉树,节点可以沿着二叉树上下左右方向,求任意两个节点之间节点数量最多的数量
- 以某个节点为根节点的树,如果根节点没在最长链路上,那么最长链路一定在左树或者右树上
- 如果根节点在最长链路上,那么结果一定为该节点左树最大高度+1+右树最大高度
- 所以最终结果为该节点左树最大长度、右树最大长度和(左树最大高度+1+右树最大高度)三者中的最大值
- 所以需要记录左右树的最大长度以及左右树的高度
- 而最大距离以及高度都是类似动态规划,重叠子问题,从最小子节点上开始一步一步往上求得答案
class Info {
constructor(d, h) {
this.maxDistance = d;
this.height = h;
}
}
function process(node) {
if (node === undefined) {
// 节点不存在时返回0,0
return new Info(0, 0);
}
const leftInfo = process(node.left);
const rightInfo = process(node.right);
const leftMax = leftInfo.maxDistance;
const rightMax = rightInfo.maxDistance;
const maxHeight = leftInfo.height + 1 + rightInfo.height;
const maxDistance = Math.max(maxHeight, leftMax, rightMax);
const height = Math.max(leftInfo.height, rightInfo.height) + 1; // 某个节点高度为左树高度和右树高度中的最大值+1
return new Info(maxDistance, height);
}
// 输入头节点,计算头节点(即整棵树)左右两边的信息
process(head);