编程之美--求二叉树中节点的最大距离

/**
 * 求二叉树中的最大距离:
 * 其思想就是利用递归,在递的过程中记录其值,然后归的过程中就少了大量的计算
 * 	计算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);
    }
}
    原文作者:满二叉树
    原文地址: https://blog.csdn.net/jiang_bing/article/details/8120268
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞