力扣解題思路 完全二叉樹 糾錯記錄

2021-10-25 09:56:38 字數 1603 閱讀 2796

思路:題目要求統計完全二叉樹的節點個數,如果拋開樹的型別,我們完全可以用普通的遞迴的方式,比如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...