题目描述
给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径穿过或者不穿过根结点。
样例
给定二叉树
1
/ \
2 3
/ \
4 5
返回 3, 它是路径 [4,2,1,3] 或者 [5,2,1,3] 的长度。
算法
(递归遍历) $O(n)$
- 递归函数的返回值定义为从当前结点到叶子结点的最大长度,当前结点为空返回 -1。
- 递归时,分别得到左右子树递归的返回值,则可以更新答案 ans = max(ans, d1 + d2 + 2);然后返回 max(d1, d2) + 1。
时间复杂度
- 每个结点最多仅被遍历一次,故时间复杂度为 $O(n)$。
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 dfs(TreeNode *r, int &ans) {
if (r == NULL)
return -1;
int d1 = dfs(r -> left, ans);
int d2 = dfs(r -> right, ans);
ans = max(ans, d1 + d2 + 2);
return max(d1, d2) + 1;
}
int diameterOfBinaryTree(TreeNode* root) {
int ans = 0;
dfs(root, ans);
return ans;
}
};
开始时按照y总的方式写的,发现wzc这种做法好理解些
return -1
那里解释的超好 thanks我看了半天为啥+2……原来root==NULL的时候返回了-1啊,我返回的是0,所以没+2