leetcode543
/**
* 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的更多相关文章
- [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 ...
- LeetCode543. Diameter of Binary Tree
Description Given a binary tree, you need to compute the length of the diameter of the tree. The dia ...
- Leetcode543.Diameter of Binary Tree二叉树的直径
给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点. 示例 : 给定二叉树 1 / \ 2 3 / \ 4 5 返回 3, 它 ...
- LeetCode543.二叉树的直径
题目 1 class Solution { 2 public: 3 int minimum = INT_MIN; 4 vector<int>res; 5 int diameterOfBin ...
- LeetCode树专题
LeetCode树专题 98. 验证二叉搜索树 二叉搜索树,每个结点的值都有一个范围 /** * Definition for a binary tree node. * struct TreeNod ...
随机推荐
- Problem A: 类的初体验
Description 定义一个类Data,只有一个double类型的属性和如下3个方法: 1. void init(double d);——初始化属性值. 2. double getVal ...
- MySQL5.7 GTID学习笔记
GTID(global transaction identifier)是对于一个已提交事务的全局唯一编号,前一部分是server_uuid,后面一部分是执行事务的唯一标志,通常是自增的. 下表整理了G ...
- 剑指Offer 5. 用两个栈实现队列 (栈)
题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目地址 https://www.nowcoder.com/practice/54275ddae22f4 ...
- echarts双y轴折线图柱状图混合实时更新图
先看下效果,自己用ps做了张gif图,发现很好玩啊..不喜勿喷 自己下载个echarts.min.js 直接上代码: <!DOCTYPE html><html><head ...
- ES6 promise学习笔记 -- 基本用法
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例. 下面代码创造了一个Promise实例. const promise = new Promise(function(reso ...
- linux c 输出信息到console
static void console_log(const char *format, ...) { static FILE *fpConsole; if (fpConsole == NULL) { ...
- jq 绑定事件和解绑事件
<!DOCTYPE html><html><head> <script src="http://cdn.static.runoob.com/libs ...
- day04元组
元组 1.元祖书写规范 users=[11,22,33,"老男孩"]#列表(可变) users=(11,22,33,"老纳海")#元祖(不可变) 1.公共方法( ...
- 五分钟带你走入MP
一.MyBatis-Plus简介 1.1MyBatis-Plus是什么? MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化 ...
- linux(centos6.9)安装步骤
http://blog.csdn.net/u012453843/article/details/52819756 https://mirrors.aliyun.com/ 下载想要的版本 2选择新建虚拟 ...