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. java代码转python代码

    (1)安装工具(windows 环境下面) 先下载antlr: http://www.antlr3.org/download/antlr-3.1.3.tar.gz 链接:http://pan.baid ...

  2. moviepy草码

    第一下. # coding=utf-8 from moviepy.editor import * from moviepy.video.tools.subtitles import Subtitles ...

  3. CentOS7:sorry,that didn't work.please try again!

    参考以下解决方案,重点是vi etc/selinux/config 把 enforcing 改为 disable 应用场景 linux管理员忘记root密码,需要进行找回操作.注意事项:本文基于cen ...

  4. 深度学习Keras框架笔记之Dense类(标准的一维全连接层)

    深度学习Keras框架笔记之Dense类(标准的一维全连接层) 例: keras.layers.core.Dense(output_dim,init='glorot_uniform', activat ...

  5. web自动化测试-模块驱动测试实例和数据驱动测试实例

    一.模块驱动测试实例 把登录和退出统一封装在login类中,若把login类单独放在一个文件中,就可以给任一测试脚本调用,这里就跟测试脚本放一起 from selenium import webdri ...

  6. learning java 推回输入流

    import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import ...

  7. less简介及其编译原理

    一.less环境安装 ①首先需要在电脑上安装nodejs,一般会内置npm,利用以下命令可以检测: ②利用npm在线安装less,运行  npm install –g less ③查看是否安装成功,L ...

  8. ThinkPad T410i 2516A21 升級手札(換SSD固態硬碟、I7 CPU、開機20秒)

    最近筆記本越來越慢,開機得20分鐘,而且CPU動不動就飆到80度,趁著開學網上活動,準備給老伙計來一次重大升級.查一下主板芯片,最高支持8G內存,已經滿了,光驅位加了一個1T機械硬盤,那麼能升級的就只 ...

  9. C博客作业01--分支丶顺序结构

    1.本章学习总结 1.1学习内容总结 分支结构 if else-if语句与switch语句都具有选择判断的功能,但是在使用时又有所区别,按题目的不同要求与题意选择不同语句. if else-if语句表 ...

  10. Alapha冲刺(3/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 摸鱼 提交记录(全组共用) 接下来的计划 沟通前后端成员,监督.提醒他们尽快完成各自的进度 学习如何评估代码质量 准备Al ...