二叉树c语言实现_LeetCode基础算法题第119篇:计算二叉树的直径

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

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

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

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

问题描述:

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

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

示例:

d2786f3383039ce8b6cca00ff7405e3b.png

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。

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

864a3cc0b3fe74cb89100b6e6b578950.png

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

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

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

具体代码如下:

aed18e20054e4095afef2a092f955045.png

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

5a91dbc6469eefdb1652aa438db732f4.png

Java语言实现:

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

3193a03487cee1d06cd7124eefa189a2.png
c28d5fd720a6fdb2d1b3bd47e82b40d1.png

Python语言实现:

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

3ffdebc01c5a752e0374c1c64645f8ea.png
ba4de5b45deee87f566dd8a34c4b4b5b.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值