Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.

Example:
Given a binary tree

          1
/ \
2 3
/ \
4 5  

Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3].

Note: The length of path between two nodes is represented by the number of edges between them.

给一个二叉树,计算二叉树的直径,直径是任意两个节点之间的最长路径。

解法1: traverse every node to get max of leftDepth, then rightDepth, then add those 2 at every node, calculate the max depth by helper.  Complexity: Time O(N^2) Space O(N^2)

解法2:find out the max of leftDepth & rightDepth while at each node, meanwhile update the total max.  Complexity: Time O(N) Space O(N)

最长路径有两种情况:

1. 最长条路径经过根节点,那么只需要找出根节点的左右两棵子树的最大深度然后相加即可。

2. 最长路径没有经过根节点,那么只需要找出根节点的左子树或者根节点的右子树作为根的最长路径度即可。递归调用,自底向上查找子树的深度,如果某一个左子树与右子树深度之和大于当前纪录的直径,那么替换为当前直径,递归完成之后即可找出直径。

参考:GeeksforGeeks  解开的都是套路

Java:

public class Solution {
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
if(root == null)
return 0;
max = Math.max(max, helper(root.left) + helper(root.right));
diameterOfBinaryTree(root.left);
diameterOfBinaryTree(root.right);
return max;
}
public int helper(TreeNode root){
if(root == null)
return 0;
return 1 + Math.max(helper(root.left), helper(root.right));
}
}

Java:

public class Solution {
int max = 0;
public int diameterOfBinaryTree(TreeNode root) {
maxDepth(root);
return max;
}
public int maxDepth(TreeNode root){
if(root == null)return 0;
int left = maxDepth(root.left);
int right = maxDepth(root.right);
max = Math.max(max, left + right);
return 1 + Math.max(left, right);
}
}  

Java:

class Solution {
int depth = 0;
public int diameterOfBinaryTree(TreeNode root) {
search(root);
return depth;
}
private int search(TreeNode root) {
if (root == null) {
return 0;
}
int left = search(root.left);
int right = search(root.right);
if (depth < left + right) {
depth = left + right;
}
return left > right ? left + 1 : right + 1;
}
} 

Python:

class Solution():
def diameter(self, root):
if not root:
return 0
res = self.depth(root.left) + self.depth(root.right)
return max(res, max(self.diameter(root.left), self.diameter(root.right))) def depth(self, node):
if not node:
return 0
return 1 + max(self.depth(node.left), self.depth(node.right))

Python:

class Solution():
def __init__(self):
self.max = 0 def diameter(self, root):
self.helper(root)
return self.max def helper(self, root):
if not root:
return 0
left = self.helper(root.left)
right = self.helper(root.right)
self.max = max(self.max, left + right)
return 1 + max(left, right)  

Python:

def height(node):
if node is None:
return 0 ;
return 1 + max(height(node.left), height(node.right)) def diameter(root):
if root is None:
return 0; lheight = height(root.left)
rheight = height(root.right) ldiameter = diameter(root.left)
rdiameter = diameter(root.right) return max(lheight + rheight, max(ldiameter, rdiameter))  

Python:

class Solution(object):
def diameterOfBinaryTree(self, root):
"""
:type root: TreeNode
:rtype: int
"""
def depth(root, diameter):
if not root: return 0, diameter
left, diameter = depth(root.left, diameter)
right, diameter = depth(root.right, diameter)
return 1 + max(left, right), max(diameter, 1 + left + right) return depth(root, 1)[1] - 1  

C++:  perfect solution , runtime = 26 ms

class Solution7 {
public:
int diameterOfBinaryTree(TreeNode *root) {
if (!root) return 0;
int res = depthOfNode(root->left) + depthOfNode(root->right);
return max(res, max(diameterOfBinaryTree(root->left), diameterOfBinaryTree(root->right)));
} int depthOfNode(TreeNode *node) {
if (!node) return 0;
return max(depthOfNode(node->left), depthOfNode(node->right)) + 1;
}
};

类似题目:

[LeetCode] 104. Maximum Depth of Binary Tree 二叉树的最大深度 

All LeetCode Questions List 题目汇总

[LeetCode] 543. Diameter of Binary Tree 二叉树的直径的更多相关文章

  1. LeetCode 543. Diameter of Binary Tree 二叉树的直径 (C++/Java)

    题目: Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of ...

  2. [leetcode]543. Diameter of Binary Tree二叉树的直径

    题目中的直径定义为: 任意两个节点的最远距离 没想出来,看的答案 思路是:diameter = max(左子树diameter,右子树diameter,(左子树深度+右子树深度+1)) 遍历并更新结果 ...

  3. [leetcode]543. Diameter of Binary Tree二叉树直径

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  4. 543 Diameter of Binary Tree 二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点.示例 :给定二叉树          1         / \        2 ...

  5. LeetCode 543. Diameter of Binary Tree (二叉树的直径)

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  6. [LeetCode] Diameter of Binary Tree 二叉树的直径

    Given a binary tree, you need to compute the length of the diameter of the tree. The diameter of a b ...

  7. 543. Diameter of Binary Tree 二叉树的最大直径

    [抄题]: Given a binary tree, you need to compute the length of the diameter of the tree. The diameter ...

  8. Leetcode543.Diameter of Binary Tree二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点. 示例 : 给定二叉树 1 / \ 2    3 / \ 4  5 返回 3, 它 ...

  9. [leetcode] 543. Diameter of Binary Tree (easy)

    原题 思路: 题目其实就是求左右最长深度的和 class Solution { private: int res = 0; public: int diameterOfBinaryTree(TreeN ...

随机推荐

  1. 关于c++中的类型转换符

    const_cast(链接) 用来去掉const或volatile属性 volatile: 用于并行设备的硬件寄存器(状态寄存器), 中断服务子程序中会访问到的非自动变量, 多线程中被几个任务共享的变 ...

  2. SpringBoot学习(五)RSocket和Security

    一.RSocket RSocket是一个用于字节流传输的二进制协议.它通过在单个连接上传递异步消息来支持对称交互模型,主要支持的通讯层包括 TCP, WebSockets和Aeron(UDP). RS ...

  3. This content should also be served over HTTPS

    HTTPS 是 HTTP over Secure Socket Layer,以安全为目标的 HTTP 通道,所以在 HTTPS 承载的页面上不允许出现 http 请求,一旦出现就是提示或报错: jqu ...

  4. LeetCode 1048. Longest String Chain

    原题链接在这里:https://leetcode.com/problems/longest-string-chain/ 题目: Given a list of words, each word con ...

  5. 解决<c:if>无else的问题

    之前发了一个jstl的if标签博客,说是jsp没有提供<c:else>标签.于是有大佬评论,说<c:choose></c:choose>可以解决,通过查资料和敲代码 ...

  6. 洛谷 P3518 [POI2011] SEJ-Strongbox 题解

    思路: 首先先将每个输入的数据与n的最大公约数求出(因为如果a[i]是密码,那么所有a[i]与n最大公约数的倍数也是密码:于是如果a[i]不是密码,那么所有a[i]与n最大公约数的倍数也都不是密码)再 ...

  7. WinDbg 图形界面功能(四)

    二.工具栏 除了断点按钮在工具栏上的每个按钮相当于菜单命令. 每个按钮的效果的完整说明,请参阅相应的菜单命令的页. 在工具栏上的按钮具有以下效果. 按钮 描述 打开源文件为只读的文件. 等效于文件 | ...

  8. NTSTATUS代码摘录

    00000000 STATUS_SUCCESS00000000 STATUS_WAIT_000000001 STATUS_WAIT_100000002 STATUS_WAIT_200000003 ST ...

  9. hasura skor 一个pg 的event trigger 扩展

    hasura skor 是一个hasura 团队早期的event triggerpg 扩展,新的推荐使用graphql engine 参考架构 缺点 只有在skor 运行的时候,数据才可以被捕捉处理 ...

  10. ipcm

    用来删除一个或更多的消息队ipcm列.信号量集或者共享内存标识