二叉樹節點間的最大距離
阿新 • • 發佈:2019-02-03
題目:
從二叉樹的節點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);
}
}