方法一 計算每個節點的左子樹和右子樹的高度和,加上根本身(邊數為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