网上看到的基本都是c或c++实现的,参照同样的算法写了个java版的。
参考文章地址:http://blog.csdn.net/cxh342968816/article/details/6656473
传一个无序数组到buildTree()方法里,会递归生成一个有序的二叉树,在按照排序递归打印到控制台。
countMaxDistance()方法是计算任意两点个节点间的最大距离
/**
* @Description : 描述
* @author YangXuan
* @email 364105996@qq.com
* @date 2013-11-25 下午8:21:13
*/
public class Quest1 {
/**
* @Description : 节点实体
*/
private class Node {
Node left;
Node right;
int nValue;
int nMaxLeft;
int nMaxRight;
Node(int data) {
nValue = data;
}
}
private Node root;
private int maxDistance = 0;
public Quest1(Node root) {
this.root = root;
}
/**
* @Description: 将数据插入二叉树并使之有序
* @return Node 返回类型
*/
private Node insert(Node node, int data) {
if (node == null) {
node = new Node(data);
} else {
if (data <= node.nValue) {
node.left = insert(node.left, data);
} else {
node.right = insert(node.right, data);
}
}
return node;
}
/**
* @Description: 将数组转换成二叉树
* @return void 返回类型
*/
public void buildTree(int[] data) {
for (int i = 0; i < data.length; i++) {
root = insert(root, data[i]);
}
}
/**
* @Description: 打印有序二叉树
* @return void 返回类型
*/
private void printTree(Node node) {
if (node == null)
return;
printTree(node.left);
System.out.print(node.nValue + " ");
printTree(node.right);
}
public void printTree() {
printTree(root);
}
private void maxDistance(Node root) {
// 遍历到叶子节点,返回
if (root == null)
return;
// 如果左子树为空,那么该节点的左边最长距离为0
if (root.left == null) {
root.nMaxLeft = 0;
}
// 如果右子树为空,那么该节点的右边最长距离为0
if (root.right == null) {
root.nMaxRight = 0;
}
// 如果左子树不为空,递归寻找左子树最长距离
if (root.left != null) {
maxDistance(root.left);
}
// 如果右子树不为空,递归寻找右子树最长距离
if (root.right != null) {
maxDistance(root.right);
}
// 计算左子树最长节点距离
if (root.left != null) {
int nTempMax = 0;
if (root.left.nMaxLeft > root.left.nMaxRight) {
nTempMax = root.left.nMaxLeft;
} else {
nTempMax = root.left.nMaxRight;
}
root.nMaxLeft = nTempMax + 1;
}
// 计算右子树最长节点距离
if (root.right != null) {
int nTempMax = 0;
if (root.right.nMaxLeft > root.right.nMaxRight) {
nTempMax = root.right.nMaxLeft;
} else {
nTempMax = root.right.nMaxRight;
}
root.nMaxRight = nTempMax + 1;
}
// 更新最长距离
if (root.nMaxLeft + root.nMaxRight > maxDistance) {
maxDistance = root.nMaxLeft + root.nMaxRight;
}
}
public void countMaxDistance() {
maxDistance(root);
}
public static void main(String[] args) {
Node root = null;
Quest1 a = new Quest1(root);
int[] data = { 9, 6, 4, 8, 7, 3, 15, 13, 16, 18, 14, 15, 15, 16 };
a.buildTree(data);
a.countMaxDistance();
a.printTree();
System.out.println();
System.out.println("任意两个节点间的最大距离为 : " + a.maxDistance);
}
}
顺带附一张草稿图便于理解