給出乙個完全二叉樹,求出該樹的節點個數。
說明:
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 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 解題思路 二分...