1. 程式人生 > >二叉樹節點間的最大距離

二叉樹節點間的最大距離

題目:

從二叉樹的節點A出發,可以向上或者向下走,但沿途的節點只能經過一次,當到達節點B時,路徑上的節點數叫作A 到B的距離。
這裡寫圖片描述
比如,上圖所示的二叉樹,節點4和節點2的距離2,節點5和節點6的距離為5。給定一顆二叉樹的頭結點head求整棵樹上節點間的最大距離。

要求:如果二叉樹的節點為N,時間複雜度要求為O(N).
思路:
二叉樹中最大距離只可能來自以下三種情況:
1.h的左子樹上的最大距離
2.h的右子樹上的最大距離
3.h的左子樹上離h.left最遠的距離+1+h的右子樹離h.rigth最遠的距離。

根據上述所說我們使用後序遍歷。詳細程式碼如下:因為這裡需要知道兩個值,左最大和左子樹中離h.left最遠距離。但是遞迴中需要返回兩個值,我們一個值使用遞迴返回,一個值使用全域性變數儲存。程式碼如下:

public class maxdiff {
    private class Node{
        public int value;
        public Node left;
        public Node right;
        public Node(int data){
            this.value=data;
        }
    }
    public int maxDistance(Node head){
        int[] record=new int[1];
        return posOrder(head,record);
    }

    private
int posOrder(Node head, int[] record) { if (head==null){ record[0]=0; return 0; } int lMax=posOrder(head.left,record);//記錄左子樹最大 int maxfromLeft=record[0];//記錄左子樹上離h.left最遠距離 int rMax=posOrder(head.right,record);//記錄右子樹最大 int maxfromRight=record[0
];//記錄右子樹上離h.right最遠距離 int curNodeMax=maxfromLeft+maxfromRight+1; record[0]=Math.max(maxfromLeft,maxfromRight)+1;//尋找到該節點最遠加1 return Math.max(Math.max(lMax,rMax),curNodeMax); } }