/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution
{
Stack<TreeNode> S = new Stack<TreeNode>();//记录访问过的节点 Dictionary<TreeNode, List<TreeNode>> dic = new Dictionary<TreeNode, List<TreeNode>>(); private void postTree(TreeNode node)
{
if (node != null)
{
S.Push(node);
if (node.left != null)
{
postTree(node.left);
}
if (node.right != null)
{
postTree(node.right);
} if (node.left == null && node.right == null)
{
var nodelist = S.ToList();
nodelist.Reverse(); if (!dic.ContainsKey(node))
{
dic.Add(node, nodelist);
}
}
S.Pop();
}
} public int DiameterOfBinaryTree(TreeNode root)
{
postTree(root); var maxDiameter = ; foreach (var d in dic)
{
foreach (var d2 in dic)
{
if (d.Key == d2.Key)
{
var diameter = d2.Value.Count - ;
maxDiameter = Math.Max(maxDiameter, diameter);
}
else
{
//第一种情况:计算叶子节点到根节点的直径
var depth = d2.Value.Count - ; var c1 = d.Value.Count;
var c2 = d2.Value.Count;
var diameter = ; if (c1 < c2)
{
for (int i = ; i < c1; i++)
{
if (d.Value[i] != d2.Value[i])
{
diameter = c1 - i + c2 - i;
break;
}
}
}
else
{
for (int i = ; i < c2; i++)
{
if (d.Value[i] != d2.Value[i])
{
diameter = c1 - i + c2 - i;
break;
}
}
} //var IncCount = d.Value.Intersect<TreeNode>(d2.Value).Count();
//var diameter = (c1 - IncCount) + (c2 - IncCount); diameter = Math.Max(diameter, depth);
maxDiameter = Math.Max(maxDiameter, diameter);
}
}
}
return maxDiameter;
}
}

https://leetcode.com/problems/diameter-of-binary-tree/#/description

补充一种递归的方式,使用python实现:

思路是每次递归判断,以当前节点为根节点是否能达到最大,见第14行。

而每次递归向上返回的是当前节点的左右子树的高度的更大的一个,加上当前节点(+1)的高度,见第15行。

 class Solution:
def __init__(self):
self.maxnum = #隐含的前提,最大的距离应该是两个叶子节点的距离
#本身这个函数是返回,当前节点到其所有叶子节点的最大深度
def getLength(self,root):
if root != None:
#左子树的最大深度
left = self.getLength(root.left)
#右子树的最大深度
right = self.getLength(root.right)
#在返回之前,更新maxnum
self.maxnum = max(self.maxnum,left+right)
return + max(left,right)
return def diameterOfBinaryTree(self, root: 'TreeNode') -> 'int':
self.getLength(root)
return self.maxnum

这道题目与leetcode104 二叉树的最大深度,思想是一样的,可以说是104题的升级版。

leetcode543的更多相关文章

  1. [Swift]LeetCode543. 二叉树的直径 | 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 ...

  2. LeetCode543. Diameter of Binary Tree

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

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

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

  4. LeetCode543.二叉树的直径

    题目 1 class Solution { 2 public: 3 int minimum = INT_MIN; 4 vector<int>res; 5 int diameterOfBin ...

  5. LeetCode树专题

    LeetCode树专题 98. 验证二叉搜索树 二叉搜索树,每个结点的值都有一个范围 /** * Definition for a binary tree node. * struct TreeNod ...

随机推荐

  1. Neo4j图数据库使用

    最近在处理一些图的数据,主要是有向图,如果图的节点不是特别大可以直接加载到内存里来处理,但是当图的节点个数特别大时,内存就放不下了:我 们牵涉到的图的节点数最大可以达到数亿个节点,已经超出的机器内存的 ...

  2. # 学号 20175223 《Java程序设计》第3周学习总结

    学号 20175223 <Java程序设计>第3周学习总结 教材学习内容总结 第四章要点: 要点1:面向对象三个性质:封装性.继承.多态: 要点2:类:类声明.类体.成员变量.方法.类的U ...

  3. alpha冲刺(3/10)

    前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 会议照片 会议内容 陈晓彬(组长) 今日进展: 召开会议 安排任务 博客撰写 制定计划 问题困扰: 前后端的交互沟通有点缺失,以至后端进度很慢,需 ...

  4. python: ImportError:DLL load failed 解决方法。

    在学习使用wordcloud 库创建词云过程中,mooc里提到可以使用另一个库函数,来创建不同形状的词云. 就是这句: ... from scipy.misc import imread mk = i ...

  5. 使用maven profile指定配置文件打包适用多环境

    新建maven项目,   在pom.xml中添加 profile节点信息如下: <profiles> <profile> <!-- 开发环境 --> <id& ...

  6. 【python接口自动化框架-unittest】如何传参数到下一个case

    1.前提 平时我们用unittest的时候,都知道每个test_ 都是相互独立的,但是很多现实情况是,我们下一个接口参数,可能会用到上一个接口返回的json字段,那么,我们怎么去实现呢 2.实例 1. ...

  7. 【java多线程】队列系统之ArrayBlockingQueue源码

    1.简介 ArrayBlockingQueue,顾名思义:基于数组的阻塞队列.数组是要指定长度的,所以使用ArrayBlockingQueue时必须指定长度,也就是它是一个有界队列. 它实现了Bloc ...

  8. SSM框架的配置

    主要是这三个配置文件 web.xml(用来加载和初始化下面的配置文件) applicationcontet.xml(就是Spring的配置文件,一般包括声明式失误等等AOP) Sprimgmvc,xm ...

  9. expect脚本实现ssh自动登录

    1:简单的实现ssh登录 #!/usr/bin/expect set ip "10.0.0.142" set user "root" set password ...

  10. git grep的一些用法

    https://www.kernel.org/pub/software/scm/git/docs/git-grep.html   把所有本地分支包含某个字符的行列出来,把含有master的列出来 gi ...