辛星Java树算法教程第八篇:二叉树的直径

在二叉树上的两个点,我们可以定义一个距离,即存在一条通路连接这两个点。
那么对于一棵二叉树来说,会存在很多这样的距离,而最大的那个距离,我们可以称之为二叉树的直径。
也有人会把二叉树的直径叫做二叉树的宽度,但是这样会很容易和另一个概念混淆。目前这两种说法都有,而我则是使用了直径和宽度的叫法来做区分。

其实实现方式还是比较简单的:
(1).如果直径通过了根节点,那么就是左子树的高度 + 右子树的高度 + 1.
(2).如果直径没有通过根节点,那么就是把左子树的直径或右子树的直径找到。
需要说明的是,这里是有可能不经过根节点奥。
话不多说,直接来看代码吧,这里我们给出的是递归的方式,是通过定义两个方法实现的,当然也可以定义在一个方法里面,读者朋友们可自行给出:

package com.mengzhidu.teach.algorithm.tree.demo.basic;

import com.mengzhidu.teach.algorithm.tree.demo.TreeNode;
import com.mengzhidu.teach.algorithm.tree.demo.TreeNodeHelper;

/**
 * 求二叉树的直径
 * 所谓二叉树的直径,即二叉树的两个点之间的最大距离
 */
public class DiameterDemo {

    public static void main(String[] args) {
        TreeNode root = TreeNodeHelper.getTreeNode();
        System.out.println("树的直径为:" + getDiameter(root));
    }

    private static int getDiameter(TreeNode node) {
        if (node == null) {
            return 0;
        }
        int leftDiameter = getDiameter(node.getLeft());
        int rightDiameter = getDiameter(node.getRight());
        int leftHeight = getHeight(node.getLeft());
        int rightHeight = getHeight(node.getRight());
        int linkedHeight = leftHeight + rightHeight + 1;
        int maxDiameter = leftDiameter > rightDiameter ? leftDiameter : rightDiameter;
        maxDiameter = maxDiameter > linkedHeight ? maxDiameter : linkedHeight;
        return maxDiameter;
    }

    private static int getHeight(TreeNode node) {
        if (node == null) {
            return 0;
        }

        int leftHeight = getHeight(node.getLeft());
        int rightHeight = getHeight(node.getRight());
        return leftHeight > rightHeight ? leftHeight + 1: rightHeight + 1;
    }
}

具体的算法代码就介绍到这里啦。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值