问题描述:结点的距离是指这两个结点之间边的个数。
算法思想:递归。首先,求左子树距根结点的最大距离,记为leftMaxDistance;其次,求右子树距根结点的最大距离,记为rightMaxDistance,那么二叉树中结点的最大距离maxDistance满足maxDistance=leftMaxDistance+rightMaxDistance。
代码如下:
package com.haobi;
/*
* 求二叉树中结点的最大距离
*/
//定义结点结构
class Node4{
public int data;
public Node4 left;
public Node4 right;
//左子树距离根结点的最大距离
public int leftMaxDistance;
//右子树距离根结点的最大距离
public int rightMaxDistance;
public Node4(int data) {
this.data = data;
this.left = null;
this.right = null;
}
}
public class Test4 {
//定义根结点
private Node4 root;
//构造方法
public Test4() {
root = null;
}
private int maxLen = 0;
private int max(int a, int b) {
return a > b ? a: b;
}
/**
* 递归查找最大距离
* @param root
*/
public void FindMaxDistance(Node4 root) {
if(root == null) {
return;
}
if(root.left == null) {
root.leftMaxDistance = 0;
}
if(root.right == null) {
root.rightMaxDistance = 0;
}
if(root.left != null) {
FindMaxDistance(root.left);
}
if(root.right != null) {
FindMaxDistance(root.right);
}
//计算左子树中距离根结点的最大距离
if(root.left != null) {
root.leftMaxDistance = max(root.left.leftMaxDistance, root.left.rightMaxDistance) + 1;
}
//计算右子树中距离根结点的最大距离
if(root.right != null) {
root.rightMaxDistance = max(root.right.leftMaxDistance, root.right.rightMaxDistance) + 1;
}
//获取二叉树所有结点的最大距离
if(root.leftMaxDistance + root.rightMaxDistance > maxLen) {
maxLen = root.leftMaxDistance + root.rightMaxDistance;
}
}
/**
* 将data插入到二叉排序树中
* @param data
*/
public void insert(int data) {
//创建新的结点
Node4 newNode = new Node4(data);
//如果树为空
if(root==null) {
//则新结点即根结点
root = newNode;
}else {//如果树不为空
//定义current指向root结点(current表示当前结点)
Node4 current = root;
//定义parent结点(即要插入结点的父结点)
Node4 parent;
//寻找插入位置
while(true) {
//current指向root再赋给parent,表示从根结点开始查找
parent = current;
if(data<current.data) {//要插入的数据小于current(当前指向)的数据
current = current.left;
if(current == null) {
//找到插入位置并插入新结点
parent.left = newNode;
return;
}
}else {//要插入的数据大于current(当前指向)的数据
current = current.right;
if(current == null) {
//找到插入位置并插入新结点
parent.right = newNode;
return;
}
}
}
}
}
/**
* 输入数据构建二叉树
* @param data
*/
public void buildTree(int[] data) {
for(int i=0;i<data.length;i++) {
insert(data[i]);
}
}
public static void main(String[] args) {
Test4 tree = new Test4();
int[] data = {2,8,7,4,9,3,1,6,7,5};
//构建二叉树
tree.buildTree(data);
tree.FindMaxDistance(tree.root);
System.out.println("最大距离:" + tree.maxLen);
}
}
程序输出结果如下:
6