首先看題目:
給定一棵二叉樹,你需要計算它的直徑長度。一棵二叉樹的直徑長度是任意兩個結點路徑長度中的最大值。這條路徑可能穿過根結點。
示例:
示例 :
給定二叉樹
1/ \ 2
3/ \
45
返回 3
, 它的長度是路徑 [4,
2,1,
3] 或者 [5,
2,1,
3]。注意:兩結點之間的路徑長度是以它們之間邊的數目表示。
解決思路:
二叉樹的題目,第一時間想到的就是遞迴演算法。首先,根據題目要求,我們要取二叉樹中的最長路徑,其實也就是該二叉樹最長的節點鏈。既然是最長節點鏈,中間肯定有乙個節點是在轉折點上的,也就是這條最長節點鏈maxnodes的根節點。而我們的最長節點鏈maxnodes是由這個根節點的最長左子鏈和最長右子鏈拼接而成的,我們的路徑長度就是maxnodes-1。我們假設最長左子鏈節點數為left,最長右子鏈節點數為right;那麼我們的最長路勁節點數就是left+right+1。
**實現:
/**
* 求二叉樹路徑最大長度
* * @param root
* @author geyuxuan 2020-03-10 21:52:18
* @return int
*///設定全域性變數,記錄最達節點數
//設定為0的話,放入乙個空樹,返回為-1,所以設定為1
int maxnodes=1;
public
intdiameterofbinarytree
(treenode root)
/** * 遞迴演算法求當前節點的最大樹深度
* @param treenode
* @author geyuxuan 2020-03-10 23:33:27
* @return int
*/private
intdepth
(treenode treenode)
//計算左最長子鏈
int left =
depth
(treenode.left)
;//計算右最長子鏈
int right =
depth
(treenode.right)
;//計算當前節點的最大節點數
maxnodes= math.
max(maxnodes,left+right+1)
;//返回當前節點的最大樹深度
return math.
max(left,right)+1
;}static
class
treenode
}
不忘初心,砥礪前行。 leetcode 二叉樹 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3 方法一 遞迴 思路 如果乙個樹的左子樹與右子樹映象對稱,則該樹是對稱的 兩個樹互為映象的...
LeetCode (二叉樹)反轉二叉樹
遞迴交換每乙個節點的左右子樹,重點在於訪問每乙個節點,然後交換左右子樹 definition for a binary tree node.struct treenode struct treenode inverttree struct treenode root 由於至少要講每乙個節點都訪問一次...
leetcode 二叉樹 二叉樹的層次遍歷
給定乙個二叉樹,返回其按層次遍歷的節點值。即逐層地,從左到右訪問所有節點 例如 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回其層次遍歷結果 3 9,20 15,7 方法一 遞迴 思路 比較訪問節點所在層次level和當前最高層次len levels 判定是否需...