思路:題目要求統計完全二叉樹的節點個數,如果拋開樹的型別,我們完全可以用普通的遞迴的方式,比如dfs,bfs都可以:
public
intcountnodes
(treenode root)
但是這樣完全沒有利用完全二叉樹的特性,首先,完全二叉樹的特點是樹的節點是一層一層的從左往右放的,也就是說該樹的層數是完全取決於最左邊的葉子節點的深度的,並且只要右邊的葉子節點存在,那麼其左邊所有葉子節點(同一層的)就一定存在。
那麼我們只需要知道該樹的層數以及最後一層的葉子節點的個數,就可以算出整個樹的節點數了。
如果滿二叉樹的層數為h,則總節點數為:2^h - 1.
那麼我們來對 root 節點的左右子樹進行高度統計,分別記為 left 和 right,有以下兩種結果:
1.left == right。這說明,左子樹一定是滿二叉樹,因為節點已經填充到右子樹了,左子樹必定已經填滿了。所以左子樹的節點總數我們可以直接得到,是 2^left - 1,加上當前這個 root 節點,則正好是 2^left。再對右子樹進行遞迴統計。
2.left != right。說明此時最後一層不滿,但倒數第二層已經滿了,可以直接得到右子樹的節點個數。同理,右子樹節點 +root 節點,總數為 2^right。再對左子樹進行遞迴查詢。
public
intcountnodes
(treenode root)
int left =
countlevel
(root.left)
;int right =
countlevel
(root.right);if
(left == right)
else
}
有一絲用二分法求旋轉陣列中心的內味了(。^▽^)
那麼接下來如何計算樹深度呢,傳統的方法是這樣:
private
intcountlevel
(treenode root)
但是這樣仍然沒有利用完全二叉樹的特性(該樹的層數是完全取決於最左邊的葉子節點的深度),所以**可以改為:
private
intcountlevel
(treenode root)
return level;
}
完整**如下:
public
intcountnodes
(treenode root)
int left =
countlevel
(root.left)
;int right =
countlevel
(root.right);if
(left == right)
else
}private
intcountlevel
(treenode root)
return level;
}
力扣解題思路 110 平衡二叉樹 糾錯記錄
思路 判斷一棵樹是否是平衡二叉樹。屬於簡單題,用dfs記錄每條路徑的長度,比較每個節點的左右子樹長度,只要不滿足就是false。但是做到一半我竟然卡住了 public boolean flag true public boolean isbalanced treenode root public i...
力扣解題思路 醜數系列 糾錯記錄
思路 把只包含因子 2 3 和 5 的數稱作醜數 ugly number 例如 6 8 都是醜數,但 14 不是,因為它包含因子 7。習慣上我們把 1 當做是第乙個醜數。求按從小到大的順序的第 n 個醜數。首先從醜數的定義我們知道,乙個醜數的因子只有2,3,5,那麼醜數p 2 x 3 y 5 z,換...
力扣二叉樹題目記錄
題目描述 輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點 含根 葉節點 形成樹的一條路徑,最長路徑的長度為樹的深度。示例 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回它的最大深度 3 匯入包構建二叉樹,否則root沒有屬性left rig...