“`java
求每个节点的直径,找出最大值
class Solution {
int ans;
public int diameterOfBinaryTree(TreeNode root) {
ans = 0;
depth(root);
return ans;
}
public int depth(TreeNode root) {
if (root == null){
return 0;
}
int L = depth(root.left);
int R = depth(root.right);
ans = Math.max(ans, L+R);
return Math.max(L, R) + 1;
}
class Solution {
int max;
public int diameterOfBinaryTree(TreeNode root) {
max=0;
int a =depth(root);
return max;
}
int depth(TreeNode root){
if(rootnull){
return 0;
}
int L= depth(root.left);
int R= depth(root.right);
max = Math.max(max,L+R);
return Math.max(L,R)+1;
“`cpp
时间复杂度O(n)空间复杂度O(high)
int res;
int depth(TreeNode* node)
{
if(!node) return 0;
int L = depth(node->left);
int R = depth(node->right);
res = max(res, L+R+1);
return max(L,R) + 1;
}
int diameterOfBinaryTree(TreeNode* root) {
res = 1;
if(!root) return res-1;
depth(root);
return res-1;
class Solution {
int max_path = 0;
int _diameterOfBinaryTree(TreeNode *r) {
if (!r) return 0;
int left = _diameterOfBinaryTree(r->left);
int right = _diameterOfBinaryTree(r->right);
max_path = std::max(max_path, left + right);
return std::max(left, right) + 1;
}
public:
int diameterOfBinaryTree(TreeNode* root) {
_diameterOfBinaryTree(root);
return max_path;
}
};
class Solution {
int ans=0;
public int diameterOfBinaryTree(TreeNode root) {
if(root==null)return 0;
f(root);
return ans-1;
}
public int f(TreeNode root){
if(root==null)return 0;
int left=f(root.left);
int right=f(root.right);
ans =Math.max(ans,left+right+1);
return Math.max(left,right)+1;
}
}
class Solution {
private int max = 1; //存放最大直径长度
public int diameterOfBinaryTree(TreeNode root) {
depthofBinaryTree(root);
return max - 1; //注意深度比路径多一个1,所以要减去
}
public int depthofBinaryTree(TreeNode root) {
if(root == null) {
return 0;
}
int left = depthofBinaryTree(root.left);
int right = depthofBinaryTree(root.right);
max = Math.max(max, left + right + 1); //由下至上存放最大值
return (left > right ? left : right) + 1;
}
}
class Solution {
int maxDiameter = 0;
public int maxDepth(TreeNode root){
if(root==null) return 0;
int leftMax = maxDepth(root.left);
int rightMax = maxDepth(root.right);
maxDiameter = Math.max(maxDiameter, leftMax+rightMax);
return Math.max(leftMax, rightMax)+1;
}
public int diameterOfBinaryTree(TreeNode root) {
maxDepth(root);
return maxDiameter;
}
}
class Solution {
int ans;
public int diameterOfBinaryTree(TreeNode root) {
ans=1;
depth(root);
return ans-1;
}
public int depth(TreeNode root){
if(root==null)
return 0;
int l=depth(root.left);
int r=depth(root.right);
ans=Math.max(l+r+1,ans);
return Math.max(l,r)+1;
}
}
class Solution {
private int ans = 0;
public int diameterOfBinaryTree(TreeNode root) {
maxDepth(root);
return ans;
}
private int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int left = maxDepth(root.left);
int right = maxDepth(root.right);
ans = Math.max(ans, left + right);
return Math.max(left, right) + 1;
}
}
int res = 0;
public int diameterOfBinaryTree(TreeNode root) {
dfs(root);
return res;
}
public int dfs(TreeNode node){
if(node == null) return 0;
int leftPath = dfs(node.left);
int rightPath = dfs(node.right);
res = Math.max(res,leftPath + rightPath);
return Math.max(leftPath,rightPath)+1;
}
// 递归
class Solution {
int maxDiameter = 0;
public int diameterOfBinaryTree(TreeNode root) {
maxDepth(root);
return maxDiameter;
}
int maxDepth(TreeNode root) {
if (root == null) return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
maxDiameter = Math.max(maxDiameter, left + right); //每次递归,计算maxDiameter
return 1 + Math.max(left, right);
}
}
class Solution{
int ans;
int depth(TreeNode* rt){
if (rt == NULL){
return 0; // 访问到了空间点了,返回为0
}
int L = depth(rt->left); // 左子树的深度
int R = depth(rt->right); // 右子树的深度
ans = max(ans,L+R+1); // 计算d_node即L+R+1,并更新ans
return max(L, R)+1; // 返回该节点为根的子树的深度
}
public:
int diameterOfBinaryTree(TreeNode* root){
ans =1;
depth(root);
return ans-1;
}
}
//思路:计算左右子树深度后,可以计算经过当前root结点的直径。
//时间O(n) 空间O(h)
class Solution {
int max = 0;
//求最大深度的同时,可以求直径
public int diameterOfBinaryTree(TreeNode root) {
if(root == null){
return 0;
}
depth(root);
return max;
}
public int depth(TreeNode root){
if(root == null){
return 0;
}
int left = depth(root.left);
int right = depth(root.right);
//计算每个结点的左右深度后,可以计算直径
int diameter = left + right;
max = diameter > max ? diameter : max; //更新最大值
return left > right ? left + 1 : right + 1;
}
}
class Solution {
int ans;
//返回的是直径长度
public int diameterOfBinaryTree(TreeNode root) {
ans=1;
depth(root);
return ans-1;
}
//给一个递归函数,求的是每一个节点的深度
int depth(TreeNode root){
if(root==null){
return 0;
}
int left=depth(root.left);
int right=depth(root.right);
ans=Math.max(ans,left+right+1);
return Math.max(left,right)+1;//求的是每个节点的深度
}
}
c++实现
int len;
int depth(TreeNode* root)
{
if(rootNULL)return 0;
int leftdep = depth(root->left);
int rightdep=depth(root->right);
len = max(len,leftdep+rightdep+1);
return max(leftdep,rightdep)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
len = 1;
depth(root);
return len-1;
}
class Solution {
int ans;
int depth(TreeNode* root){
if (root == NULL) return 0;
int L = depth(root->left);
int R = depth(root->right);
ans = max(ans, L + R + 1);
return max(L, R) + 1;
}
public:
int diameterOfBinaryTree(TreeNode* root) {
ans = 1;
depth(root);
return ans - 1;
}
};
//时间复杂度O(n)
//时间复杂度O(nlogn)
共以下 31 个回答
“`java
求每个节点的直径,找出最大值
class Solution {
int ans;
public int diameterOfBinaryTree(TreeNode root) {
ans = 0;
depth(root);
return ans;
}
}
class Solution {
int max;
public int diameterOfBinaryTree(TreeNode root) {
max=0;
int a =depth(root);
return max;
}
int depth(TreeNode root){
if(rootnull){
return 0;
}
int L= depth(root.left);
int R= depth(root.right);
max = Math.max(max,L+R);
return Math.max(L,R)+1;
}
计算返回节点深度,找出节点深度与路径关系
“`java
时间复杂度 为O(n) 空间为O(n.depth)
class Solution {
int max=0;
public int diameterOfBinaryTree(TreeNode root) {
if(root==null) return 0;
// 最长的一定是两个结点之间
//使用深度优先算法请求每个结点 的深度,然后使用一个max变量进行保存
}
“`cpp
时间复杂度O(n)空间复杂度O(high)
int res;
int depth(TreeNode* node)
{
if(!node) return 0;
int L = depth(node->left);
int R = depth(node->right);
res = max(res, L+R+1);
return max(L,R) + 1;
}
int diameterOfBinaryTree(TreeNode* root) {
res = 1;
if(!root) return res-1;
depth(root);
return res-1;
“`cpp
【思路】对于一条在某个节点处拐弯的path,其最大路径长度即该节点左右子树深度的和
【复杂度】时间复杂度O(n),空间复杂度O(logn)最差O(n)
用递归求左右子树的深度,深度和就是当前节点的直径,再用一个全局变量储存每次的直径最大值,最后输出
求二叉树的最大直径,递归的思想。某树的最大直径为其左右子树的最大直径或该节点左右子树的深度之和
时间复杂度遍历了整个二叉树,空间复杂度递归栈也为二叉树大小,都为O(n)
时间复杂度是O(N), 遍历了所有节点
空间复杂度是O(height),对树的高度进行了递归
复杂度
时间复杂度: $O(n)$
空间复杂度: $O(1)$
Code
时间复杂度为O(n)
空间复杂度为O(n)
思路:因为是二叉是,其最大直径=左子树最大深度+右子树最大深度
时间复杂度: O(n) 空间复杂度:O(n)
同时记录当前节点的直径和子树节点最大直径,时间O(n) 空间O(n)
深度
dfs
时间:O(n)
空间:O(n)
MY长度是节点数-1。
时间复杂度:O(n)
空间复杂度:O(n)
做两次递归:1是计算某个节点的最大深度 2是计算某个节点的最大直径(左最大深度+右最大深度)。看了讲解发现可以优化为设置一个全局变量,在获取节点最大深度时,就把左边最大深度+右边最大深度之和与全局变量比较,取最大值。
时间复杂度:O(N^2)
空间复杂度:O(N)
该结点深度=子节点深度最大值+1
这里假设的叶子结点深度为1
时间复杂度:O(n)
空间复杂度:O(树的高度)
C++实现
使用全局变量记录 返回高度
时间复杂度:O(N)
时间复杂度:O(n) n是二叉树的节点树
空间复杂度:O(h) h是二叉树的高度
c++实现
int len;
int depth(TreeNode* root)
{
if(rootNULL)return 0;
int leftdep = depth(root->left);
int rightdep=depth(root->right);
len = max(len,leftdep+rightdep+1);
return max(leftdep,rightdep)+1;
}
int diameterOfBinaryTree(TreeNode* root) {
len = 1;
depth(root);
return len-1;
}