1. 题目描述
给定一棵二叉树的头节点head,返回整棵二叉树的最大距离。
说明:这个最大距离包含两端点。比如:
2. 测试案例
- 二叉树为空
- 二叉树不空
3. 最佳思路
前置知识:
在第2步中,以x为头结点,讨论答案的可能性时,常常将情况分为两类:
- 与x有关…
- 与x无关…
4. 代码
public class Main {
static class Node {
public int value;
public Node left;
public Node right;
public Node(int data) {
this.value = data;
}
}
static class Info {
public int maxDistance;
public int height;
public Info(int maxDistance, int height) {
this.maxDistance = maxDistance;
this.height = height;
}
}
public static void main(String[] args) {
Node root = new Node(1);
root.left = new Node(2);
root.right = new Node(3);
root.left.left = new Node(4);
root.left.right = new Node(5);
root.right.left = new Node(6);
root.right.right = new Node(7);
System.out.println(maxDistanceOfBT(null));
}
// 求一颗二叉树的最大距离
public static int maxDistanceOfBT (Node root) {
return pos(root).maxDistance;
}
// 使用递归后序遍历解题
public static Info pos(Node root) {
if (root == null)
return new Info(0, 0);
// 左
Info leftInfo = pos(root.left);
// 右
Info rightInfo = pos(root.right);
// 根
int x1 = leftInfo.height + rightInfo.height + 1; // 与x有关时
int x2 = Math.max(leftInfo.maxDistance, rightInfo.maxDistance); // 与x无关时
Info info = new Info(Math.max(x1, x2),
Math.max(leftInfo.height, rightInfo.height) + 1);
return info;
}
}