龙空技术网

LeetCode基础算法题第119篇:计算二叉树的直径

吾是我师 586

前言:

眼前你们对“计算二叉树高度的算法是什么”可能比较珍视,小伙伴们都需要了解一些“计算二叉树高度的算法是什么”的相关内容。那么小编在网摘上收集了一些对于“计算二叉树高度的算法是什么””的相关知识,希望各位老铁们能喜欢,大家快快来学习一下吧!

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

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

问题描述:

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

注:两结点之间的路径长度是以它们之间边的数目表示。

示例:C语言实现:

题目中提醒我们,"两结点之间的路径长度是以它们之间边的数目表示"。这个提醒可能会误导你,让你真的认为应该去数边。

其实我们认真的去观察就会很容易发现,两节点的路径的长度其实等于在它们所在的最小子树中相对层数的和减2。

以上面的示例说明:

节点4到3所在的子树是整个树,4在层3,3在层2。所以4到3的路径长度是3+2-2=3;节点4和节点5的所在的子树是 2-4-5,2作为子树根节点,在这个子树中4和5都在该子树的层2,所以他们的距离是2+2-2=2。

从示例中我们发现,该二叉树的直径是二叉树中离的最远的两个节点的路径,我们直观的感觉可能认为离的最远的节点应该是整个二叉树中最左边的叶子节点和最右边的叶子节点。事实并不完全正确,看下面的例子:

这个二叉树没有左节点,右子树的高等是4,但是它的直径(最长路径)是节点5到节点8的路径,整个路径并不经过根节点1,而是在一个子树范围内形成的。

所以我们需要考虑所有子树。我们的思路是:

以每一个节点为子树根节点,计算当前子树的左右子树层数的和减2(仅仅是陈述思路,实际代码中并不需要减2),这样得到的值就是当前子树的直径,我们计算出所有的值,然后其中最大的一个将会是整个二叉树的直径。

具体代码如下:

使用递归方式会比较容易,所以我们定义一个辅助函数来完成上面的逻辑。该函数有一个整形指针参数res,用来保存所有子树中直径最大的值,所以当递归完成后,res保存的就是整个树的直径。该函数要返回值当前子树的高度给上层递归调用以方便其计算它的直径。

Java语言实现:

Java 的实现和C语言的实现一致,不再撰述。

Python语言实现:

Python 的实现和C语言的实现一致,不再撰述。

标签: #计算二叉树高度的算法是什么 #leetcode树算法总结 #设计一个算法求二叉树中指定节点所在的层数