dfs求树的直径JAVA_LeetCode 21.二叉树的直径 DFS深度遍历

本文介绍了如何使用深度优先搜索(DFS)算法解决二叉树的最大直径问题。在给定的二叉树中,直径是任意两个节点之间的最长路径。示例展示了当最大直径不经过根节点时的处理方法。通过递归的DFS,计算每个节点的最大深度,并找到全局的最大直径。代码展示了如何实现这个算法。

题目描述

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

示例 :

给定二叉树

1

/ \

2  3

/ \

4   5

返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

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

解题思路

任意两个节点之间的边数都可能是最大直径

最大的直径不一定包括根节点

这道题很容易有的误区就是:从根节点出发,找到左边数的最大深度 leftDepth,再找到右边树的最大深度 rigthDepth

然后 return leftDepth+rigthDepth + 1(如果二叉树的根节点深度为0的话)

53916ec2942042d22b8957c796c27979.png

从上面的图可以看出,情况并不是这样,因为最大值不一定要包含根节点。

从上面的分析可知,最大值不一定包含根节点,但是一定是:经过一个节点,该节点左右子树的最大深度之和 +1+1(二叉树的根节点深度为 00)

于是,可以使用 DFS,找出所有节点的最大直径,在取出最大值 res;

定义一个全局变量 res,用来记录最大直径

使用 dfs(root) 遍历所有的节点,dfs(root) 的作用是:找出以 root 为根节点的二叉树的最大深度

将根节点的深度定义为 11(和上面分析的深度定义不一样)

root 为跟节点的最大深度为 Math.max(leftDepth,rigthDepth) + 1

res 取值为以经过 root,左右子树的最大深度之和 leftDepth + rigthDepth(不用加 11,是因为根节点的深度是 11)

通过递归,找到 res 的最大值

0a50d96960b813a8f0958169ac0fa8cd.png

c2d92e38951d691dd5e61fc255d7b796.png

05b058121454862f00159cec3e9f4817.png

1598493-20200310205649913-437165743.png

1598493-20200310205723131-242597979.png

作者:sugar-31

链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/java-shen-du-you-xian-bian-li-dfs-by-sugar-31/

代码如下

/**

* Definition for a binary tree node.

* public class TreeNode {

* int val;

* TreeNode left;

* TreeNode right;

* TreeNode(int x) { val = x; }

* }

*/

class Solution {

private int max=0;

public int diameterOfBinaryTree(TreeNode root) {

dfs(root);

return max;

}

private int dfs(TreeNode root){

if(root==null){

return 0;

}

int leftHight=dfs(root.left);

int rightHight=dfs(root.right);

max=Math.max(leftHight+rightHight,max);

return Math.max(leftHight,rightHight)+1;

}

}

标签:21,int,max,dfs,DFS,二叉树,root,节点

来源: https://www.cnblogs.com/Transkai/p/12458576.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值