二叉樹最大距離(直徑)

看風景就發表於2017-05-17
方法一 計算每個節點的左子樹和右子樹的高度和,加上根本身(邊數為2),取最大值

二叉樹的最大距離,一定是經過根或者某個子樹的根的路徑,其兩個端點必然是葉子節點或者根節點。計算二叉樹的高度,並且比較經過該節點的最大距離,取

最大者。其中,getTreeDistance的起點是-1,其值為二叉樹的高度減1,即高度路徑上的點之間的邊的條數,即距離。getTreeDistance引入了新的概念描述,

getTreeHeight是求樹的高度,但是其計算時候要減去1.經過一個根節點的最大距離,就是其左子樹最大高度距離(不是最大距離),加上其右子樹最大高度距離,加上

左右到根節點的距離,即2,然後與一個外部變數比較,因此使用了兩個函式。

實現程式碼如下:

function Node(val){
    this.val = val;
    this.left = null;
    this.right = null;
}
function getMaxDistance(){ var max_d = 0; getTreeHeight(root);//或者getTreeDistance(root); return max_d; }
function getTreeDistance(root){ if(!root){ return -1; } var lh = getTreeDistance(root.left), rh = getTreeDistance(root.right); var distance = lh + rh + 2; max_d = Math.max(distance,max_d); return Math.max(lh,rh) + 1; }
function getTreeHeight(root){ if(!root){ return 0; } var lh = getTreeHeight(root.left), rh = getTreeHeight(root.right); var distance = (lh -1) + (rh - 1) + 2; max_d = Math.max(distance,max_d); return Math.max(lh,rh) + 1; }
方法二 按照節點是否跨根,分為左子樹最大距離,右子樹最大距離,左右子樹最大深度加到根節點的距離,即2,取最大者
同樣區分高度距離和高度,起點不同,高度距離為-1,高度為0,用物件距離結果,然後返回。
function getMaxDistance(root){
    if(!root){
        return {
            maxDist:-1,                    
            maxDistance:0
        }
    }
    var lRes = getMaxDistance(root.left),
        rRes = getMaxDistance(root.right);
    var result = {
        maxDist:Math.max(lRes.maxDist,rRes.maxDist) + 1,
        maxDistance:Math.max(lRes.maxDistance,rRes.maxDistance,lRes.maxDist + rRes.maxDist + 2)
    }
    return result;
}

function getMaxDistance(root){
    if(!root){
        return {
            maxDepth:0,                    
            maxDistance:0
        }
    }
    var lRes = getMaxDistance(root.left),
        rRes = getMaxDistance(root.right);
    var result = {
        maxDepth:Math.max(lRes.maxDepth,rRes.maxDepth) + 1,
        maxDistance:Math.max(lRes.maxDistance,rRes.maxDistance,(lRes.maxDepth-1) + (rRes.maxDepth-1) + 2)
    }
    return result;
}

 

出處: http://blog.csdn.net/flyinghearts/article/details/5605995

    http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html    

相關文章