給定二叉樹,求取該二叉樹多有節點中距離最遠的結點相隔的距離
以root為根節點的樹上,最大距離求取
情況一:root的左子樹上的最大距離
情況二:root的右子樹上的最大距離
情況三:root左子樹上距離root結點最遠的距離,加上root自身這個節點,再加上root右子樹上距離root右孩子最遠的距離
三個值中最大的即為所求
1、整個過程為後序遍歷,在二叉樹的每棵子樹上指向步驟2
2、假設子樹頭root,處理root的左子樹,得到兩個資訊,左子樹上的最大距離記為lmax1,左子樹上距離root左孩子的最遠距離記為lmax2。處理root右子樹得到右子樹上的最大距離記為rmax1,距離root右孩子的最遠距離記為rmax2。那麼跨root結點情況下的最大距離為lmax2+1+rmax2,這個值與lmax1和rmax1比較,最大值即為所求
3、lmax2+1就是root左子樹上距離root最遠的點到root的距離
rmax2+1就是root右子樹上距離root最遠的點到root的距離
兩者中最大的乙個作為root樹上距離root最遠的距離返回
4、用返回長度為2的陣列的方式,可以做到返回兩個值
/**
* 從二叉樹的節點a出發,可以向上或者向下走,但沿途的節點只能經過一次,當
* 到達節點b時,路徑上的節點數叫作a到b的距離。對於給定的一棵二叉樹,求整棵樹上節點間的最大距離。
* 給定乙個二叉樹的頭結點root,請返回最大距離。保證點數大於等於2小於等於500.
*/private static class treenode
}private static int findlongest(treenode root)
private static int findlongestcore(treenode node, int res)
int lmax = findlongestcore(node.left, res);//當前節點左子樹上距離當前結點左孩子的最遠距離
int maxleftchild = res[0];//當前結點左子樹上距離當前節點最遠的距離(不包括當前節點自身)
int rmax = findlongestcore(node.right, res);//當前節點右子樹上距離當前結點右孩子的最遠距離
int maxrightchild = res[0];//當前結點左子樹距離當前節點最遠的距離(不包括當前節點自身)
res[0] = math.max(maxleftchild + 1, maxrightchild + 1);//當前結點的子樹距離當前結點的最遠距離(包括當前結點)
return math.max(math.max(lmax, rmax), maxleftchild + maxrightchild + 1);
}
(演算法)二叉樹兩個結點的最遠距離
求二叉樹兩個結點的最遠距離。二叉樹定義如下 class treenode 遍歷每個節點,找出以當前節點為根的最長路徑,然後找出所有最長路徑中的最大值。1 class node void longestpath 1 node proot,int maxlen int rightlen if proot...
刷題之路 二叉樹上最遠距離
從二叉樹的節點a出發,可以向上或者向下走,但沿途的節點只能經過一次,當到達節點b時,路徑上的節點數叫作a到b的距離。對於給定的一棵二叉樹,求整棵樹上節點間的最大距離。最大距離不外乎兩種情況 1 左子樹或者右子樹特別龐大,最大距離出現在左子樹或右子樹兩個節點之間 2 左右兩子樹節點數量大致平衡,則最大...
求二叉樹兩節點的最遠距離
題目要求比較簡單,寫一程式求一棵二叉樹中相距最遠的兩個節點之間的距離。其實第一眼就能相當用遞迴是最簡單也是最直觀的 以當前節點v為根的子樹中兩節點的最遠距離有三種情況 1 距離最遠的兩個節點均在v的左子樹 2 距離最遠的兩個節點均在v的右子樹 3 距離最遠的兩個節點乙個在左子樹乙個在右子樹 或者v就...