方法 1:深度优先搜索
任意一条路径可以被写成两个 箭头(不同方向),每个箭头代表一条从某些点向下遍历到孩子节点的路径。
假设我们知道对于每个节点最长箭头距离分别为 L, R,那么最优路径经过 L + R + 1 个节点。
按照常用方法计算一个节点的深度:max(depth of node.left, depth of node.right) + 1。在计算的同时,经过这个节点的路径长度为 1 + (depth of node.left) + (depth of node.right) 。搜索每个节点并记录这些路径经过的点数最大值,期望长度是结果 - 1。
def diameterOfBinaryTree(self, root: TreeNode) -> int:
self.ans = 1
def depth(node):
if not node: return 0
L = depth(node.left)
R = depth(node.right)
self.ans = max(self.ans, L+R+1) # 左最长+右最长+根节点
return max(L, R) + 1 # 子节点的最长
depth(root)
return self.ans - 1
cpp:
class Solution {
public:
int depth(TreeNode* root,int &ans)
{
if(!root) return 0;
int L = depth(root->left,ans);
int R = depth(root->right,ans);
ans = max(ans,L+R);
return max(L,R)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
int ans = 0; # 初始值为0可以省去不必要的+1 -1
depth(root,ans);
return ans;
}
};