题意:
方法一:
递归
思路:核心:当前节点的直径=左子树高度+右子树高度。递归整棵树,以每个节点作为根节点,计算当前节点的直径=左子树高度+右子树高度,并维护直径的最大值。因此,要写个递归函数求解每个子树的高度。(后序遍历)计算每个子树的高度=max(左子树的高度,右子树的高度)+1。
class Solution {
public:
int res=0;
int diameterOfBinaryTree(TreeNode* root) {
dfs(root);//递归
return res;
}
int dfs(TreeNode *root){//递归计算子树的高度
if(root==nullptr)
return 0;
int l=dfs(root->left);
int r=dfs(root->right);
res=max(res,l+r);//直径=
return max(l,r)+1;//子树的高度等于max(左子树的高度,右子树的高度)+1
}
};
时间复杂度:
空间复杂度:![]()
方法二:
java
思路:思路与方法一相同。
import java.util.*;
public class Solution {
int res=0;
public int diameterOfBinaryTree (TreeNode root) {
dfs(root);//递归
return res;
}
int dfs(TreeNode root){//递归计算子树的高度
if(root==null)
return 0;
int l=dfs(root.left);
int r=dfs(root.right);
res=Math.max(res,l+r);//当前节点的直径=左子树高度+右子树高度
return Math.max(l,r)+1;//子树的高度=max(左子树的高度,右子树的高度)+1
}
}
时间复杂度:
空间复杂度:![]()



京公网安备 11010502036488号