在二叉树上的两个点,我们可以定义一个距离,即存在一条通路连接这两个点。
那么对于一棵二叉树来说,会存在很多这样的距离,而最大的那个距离,我们可以称之为二叉树的直径。
也有人会把二叉树的直径叫做二叉树的宽度,但是这样会很容易和另一个概念混淆。目前这两种说法都有,而我则是使用了直径和宽度的叫法来做区分。
其实实现方式还是比较简单的:
(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;
}
}
具体的算法代码就介绍到这里啦。