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. 实现批量添加10个用户,用户名为user01-10,密码为user后面跟3个随机字符

    #!/bin/bash ` do user="user$i" password=$( | md5sum | ) useradd user$i echo "$user$pa ...

  2. CentOS 7.5下KVM的安装与配置

    由于没有物理机可用,在自己的VMware Workstation中CentOS 7.5下搭建完成. 首先查看VMware Workstation是否支持虚拟化,把红框内打钩即可. 虚拟化开启并安装Ce ...

  3. test201909027 老Z

    30+100+40=170.数据出锅*2,也是没谁了. 装饰 快要到 Mope 的生日了,Mope 希望举行一场盛大的生日派对. 派对的准备工作中当然有装饰房间啦.Mope 的房间里有按从左到右的顺序 ...

  4. Java 锁(学习笔记)

    关于Java 锁的知识整理与回顾(个人笔记): 锁有哪些,分别用来干嘛? Java实现锁有两种方式,synchronized关键字和Lock (1)Lock(可判断锁状态) Lock是基于JDK层面实 ...

  5. 实现redis缓存,缓存穿透简单原理

    String get(String key) { String value = redis.get(key); if (value == null) { if (redis.setnx(key_mut ...

  6. 目标检测的mAp

    众多目标检测的知识中,都提到了mAp一值,那么这个东西到底是什么呢: 我们在评价一个目标检测算法的"好坏"程度的时候,往往采用的是pascal voc 2012的评价标准mAP.目 ...

  7. Oracle 分区默认segment大小变化(64k—>8M)

    原文链接:http://www.cnblogs.com/wcwen1990/p/6656545.html _partition_large_extents和_index_partition_large ...

  8. php大附件上传,支持断点续传

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...

  9. Debian 9 安装 libsodium

    到这里查看最新的版本号.如现在最新的版本号为1.0.18.下面均以该版本为例. 下载.编译和安装: wget https://download.libsodium.org/libsodium/rele ...

  10. P5589 【小猪佩奇玩游戏】

    这题还是比较妙妙套路的,复杂度为\(O(log^2N)\),可以卡掉\(\sqrt n\)的做法 首先我们可以把原数列分成很多个集合,集合之间肯定是两两独立的,考虑分别计算答案 我们定义\(f_i\) ...