题目描述
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
示例 :
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
注意:两结点之间的路径长度是以它们之间边的数目表示。
解题思路
利用递归的思路,从根节点开始,计算每个节点的高度:等于左右孩子节点的高度的最大值加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。
代码实现
// C++版本
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxDepth(TreeNode* node, int& ans) {
if (node == nullptr) return 0;
int L = maxDepth(node->left, ans);
int R = maxDepth(node->right, ans);
ans = max(ans, L+R+1);
return max(L, R)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
int ans = 1;
maxDepth(root, ans);
return ans-1;
}
};
# python版本
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
self.res = 1
def maxDepth(node):
if node == None:
return 0
L = maxDepth(node.left)
R = maxDepth(node.right)
self.res = max(self.res, L+R+1)
return max(L, R) + 1
maxDepth(root)
return self.res - 1