LeetCode 222 完全二叉樹的節點個數

2021-10-10 19:20:28 字數 1482 閱讀 7499

給出乙個完全二叉樹,求出該樹的節點個數。

說明:

完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1~

示例:

輸入: 

1/ \

2   3

/ \  /

4  5 6

輸出: 6

對於任意二叉樹,都可以通過廣度優先搜尋或深度優先搜尋計算節點個數,時間複雜度和空間複雜度都是 o(n),其中 n 是二叉樹的節點個數。這道題規定了給出的是完全二叉樹,因此可以利用完全二叉樹的特性計算節點個數。

規定根節點位於第 0 層,完全二叉樹的最大層數為 h。根據完全二叉樹的特性可知,完全二叉樹的最左邊的節點一定位於最底層,因此從根節點出發,每次訪問左子節點,直到遇到葉子節點,該葉子節點即為完全二叉樹的最左邊的節點,經過的路徑長度即為最大層數 h。

當 0≤i當最底層包含 1 個節點時,完全二叉樹的節點個數是

當最底層包含

因此對於最大層數為 h 的完全二叉樹,節點個數一定在

具體做法是,根據節點個數範圍的上下界得到當前需要判斷的節點個數 k,如果第 k 個節點存在,則節點個數一定大於或等於 k,如果第 k 個節點不存在,則節點個數一定小於 k,由此可以將查詢的範圍縮小一半,直到得到節點個數。

如何判斷第 k 個節點是否存在呢?如果第 k 個節點位於第 h 層,則 k 的二進位制表示包含 h+1 位,其中最高位是 1,其餘各位從高到低表示從根節點到第 k 個節點的路徑,0 表示移動到左子節點,1 表示移動到右子節點。通過位運算得到第 k 個節點對應的路徑,判斷該路徑對應的節點是否存在,即可判斷第 k 個節點是否存在。

複雜度分析首先需要 o(h) 的時間得到完全二叉樹的最大層數,其中 h 是完全二叉樹的最大層數。

使用二分查詢確定節點個數時,需要查詢的次數為

1、2、

leetcode 222 二分完全二叉樹

解法一 dfs暴力求解 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none class solution def countnodes s...

LeetCode 222 完全二叉樹的節點個數

給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 1 2 3 4 5 6 輸出 6方法一 def...

Leetcode 222 完全二叉樹的節點個數

給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 1 2 3 4 5 6輸出 6 解題思路 二分...