题意:
方法一:
递归
思路:核心:当前节点的直径=左子树高度+右子树高度。递归整棵树,以每个节点作为根节点,计算当前节点的直径=左子树高度+右子树高度,并维护直径的最大值。因此,要写个递归函数求解每个子树的高度。(后序遍历)计算每个子树的高度=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 } }
时间复杂度:空间复杂度: