二叉树节点间的最大距离问题
【问题】
从二叉树的节点a出发, 可以向上或者向下走, 但沿途的节点只能经过一次, 到达节点b时路径上的节点个数叫作a到b的距离, 那么二叉树任何两个节点之间都有距离, 求整棵树上的最大距离。
【解题思路】
1.以root为头结点,来分析这棵树,有两种情况:
(1)这个最大值经过了头结点,这个时候最大距离为左树中离头结点最远的结点到右树中离头结点最远的结点的距离。
(2)这个最大值不经过头结点root,那么最大距离就是左树和右树的最大距离较大的那一个。
2.构造一个类表示递归过程中左子树和右子树返回的数据maxDistance最大距离,和h最大高度
3.递归,将左子树的最大距离与右子树的最大距离以及(左子树高度+右子树高度+1)这三个值比较,返回最大值以及左子树与右子树中h的最大值+1。
![](https://i-blog.csdnimg.cn/blog_migrate/172d9b100cedd37c8e3a28ba4d870891.png)
【代码实现】
public class TreeMaxDistance {
/*二叉树节点间的最大距离问题
从二叉树的节点a出发, 可以向上或者向下走, 但沿途的节点只能经过一次, 到达节点b时路
径上的节点个数叫作a到b的距离, 那么二叉树任何两个节点之间都有距离, 求整棵树上的最
大距离。*/
public static ReturnData treeMaxDistance(Node root) {
if (root == null) {
return new ReturnData(0, 0);
}
ReturnData leftData = treeMaxDistance(root.left);
ReturnData rightData = treeMaxDistance(root.right);
int max = leftData.h + rightData.h + 1;
int max1 = leftData.maxDistance;
int max2 = rightData.maxDistance;
max = Math.max(Math.max(max1, max2), max);
int h = Math.max(leftData.h, rightData.h);
return new ReturnData(max, h + 1); //h+1是因为这个时候加上了这个树的头结点
}
public static class ReturnData {
int maxDistance; //表示最大距离
int h; //表示树的高度
public ReturnData(int maxDistance, int h) {
this.maxDistance = maxDistance;
this.h = h;
}
}
//结点类
public static class Node {
int value;
Node left;
Node right;
public Node(int value) {
this.value = value;
}
}
//测试代码
public static void main(String[] args) {
Node root = new Node(1);
Node node2 = new Node(2);
Node node3 = new Node(3);
Node node4 = new Node(4);
Node node5 = new Node(5);
Node node8 = new Node(8);
Node node9 = new Node(9);
Node node10 = new Node(10);
Node node11 = new Node(11);
root.left = node2;
root.right = node3;
node2.left = node4;
node2.right = node5;
node4.left = node8;
node8.left = node11;
node5.right = node9;
node9.right = node10;
ReturnData returnData = treeMaxDistance(root);
System.out.println("maxDistance=" + returnData.maxDistance);
}
}