/**
* 求二叉树中的最大距离:
* 其思想就是利用递归,在递的过程中记录其值,然后归的过程中就少了大量的计算
* 计算root 的到叶子的最大距离,假设这个最大距离以每一个结点为根,那么我们就求以所有为根的节点的最大距离
* 当计算 以 e 当根的最大距离时,由于 e 还有 left,与right,如果left=null 那么 它的leftMax = 0
* 同理如果right = null ,则 leftMax = 0,
* 但是如果 left 与 right 有一个或都不为0 ,我们想求出 当前 e 的 leftMax 与 rightMax 就必需先知道 e.left.leftMax 与 e.left.rightMax
* 然后取两者的较大者加1 赋值 给 e.leftMax,同理e.rightMax 也是这个方法,这样是进行了递的过程
* 当我们知道 e.leftMax 与 e.rightMax,然后再与最后的结点maxLen 进行比较,大于MaxLen 则进行更新,最后保存的就是一个最大值,
* 同时复杂度也就是进行了一次深度搜索
*
*
*
*
* 为了建树的方便,就以一个二叉排序树为例
*/
public class MaxLenOfTree {
private Entry root;
static int maxLen;
void add(int val) {
if (root == null) {
root = new Entry(val, null, null, null);
return;
}
Entry p = root, parent = root;
while (p != null) {
int ans = val < p.value ? -1 : (val == p.value ? 0 : 1);
parent = p;
if (ans < 0) {
p = p.left;
} else if (ans > 0)
p = p.right;
else
return;
}
Entry newEntry = new Entry(val, parent, null, null);
if (val < parent.value)
parent.left = newEntry;
else
parent.right = newEntry;
}
public void list() {
list(root);
}
private void list(Entry root) {
if (root == null)
return;
list(root.left);
System.out.println(root.value);
list(root.right);
}
static class Entry {
int value;
Entry parent;
Entry left;
Entry right;
int leftMax;
int rightMax;
public Entry(int val, Entry parent, Entry left, Entry right) {
value = val;
this.parent = parent;
this.left = left;
this.right = right;
}
}
/**
* 计算最大距离
*
* @param root
*/
public int findMaxLen() {
findMaxLen(root);
return maxLen;
}
private void findMaxLen(Entry e) {
if (e == null)
return;
if (e.left == null)
e.leftMax = 0;
else
findMaxLen(e.left); // 先找子左子树的的
// maxLeft,maxRight,然后在归的过程中就把当前的e的求出来了
if (e.right == null)
e.rightMax = 0;
else
findMaxLen(e.right); // 再找出右子树的maxLeft,maxRight;
// 然后找出左子树中的最大值为当前结点的左点的的最在值,右子树的最大值为当前结点右子树的最大值
if (e.left != null)
e.leftMax = Math.max(e.left.leftMax, e.left.rightMax) + 1; // 不要忘了加1
if (e.right != null)
e.rightMax = Math.max(e.right.leftMax, e.right.rightMax) + 1;
int tmp = e.leftMax + e.rightMax; // 取出 leftMax + rightMax 与最终的maxLen
// 进行比较
System.out.println(tmp);
maxLen = maxLen < tmp ? tmp : maxLen;
}
public static void main(String args[]) {
MaxLenOfTree tree = new MaxLenOfTree();
tree.add(7);
tree.add(5);
tree.add(2);
tree.add(6);
tree.add(1);
tree.add(10);
tree.add(8);
tree.add(12);
tree.add(9);
int ans = tree.findMaxLen();
System.out.println(ans);
}
}