222. 完全二叉樹的節點個數
給你一棵完全二叉樹的根節點 root ,求出該樹的節點個數。
完全二叉樹的定義如下:在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1~ 2h 個節點。
示例:輸入:root = [1,2,3,4,5,6]
輸出:6
對於任意一顆二叉樹來說,我們都可以使用深度優先搜尋和廣度優先搜尋來計算節點的個數,其時間複雜度和空間複雜度都是o(n)。那對於一顆完全二叉樹來說,有什麼更好的求解方式嗎?
根據完全二叉樹的特徵可知,完全二叉樹的最左邊的節點一定位於樹的最後一層,因此從根節點出發,每次訪問左子節點,直到遇到葉子節點,該葉子節點即為完全二叉樹的最左邊的節點,經過的路徑長度即為二叉樹的最大層數。
我們假設完全二叉樹的根節點位於第0層,完全二叉樹的最大層數是h,當0<= i < h時,第i層包含2i個節點,最後一層包含的節點數為1~2h個節點。因此對於最大層數為h的完全二叉樹來說,節點個數在[2h, 2h+1-1]範圍內,我們可以在該範圍內通過二分查詢的方式得到完全二叉樹的節點個數。
具體來說,我們可以在[2h, 2h+1-1]範圍內進行二分查詢。我們根據範圍的上下界得到當前需要判斷的節點個數 k,如果第 k個節點存在,則節點個數一定大於或等於 k,如果第 k個節點不存在,則節點個數一定小於 k,由此可以將查詢的範圍縮小一半,直到得到節點個數。
下面我們來看一下如何判斷第k個節點是否存在?
假設第k個節點位於第h層,則數k的二進位制表示包含h+1位,其中最高位是1,其餘各位從高到低表示從根節點到第 k個節點的路徑,0 表示移動到左子節點,1 表示移動到右子節點。通過位運算得到第 k個節點對應的路徑,通過判斷該路徑對應的節點是否存在,即可判斷第 k 個節點是否存在。
下面我們來看一下**的實現。
class solution:
def countnodes(self, root):
if not root:
return 0
#求數的層數
level=0
node=root
while node.left:
level=level+1
node=node.left
#完全二叉樹的節點個數範圍是[2^h,(2^h+1)-1]
low=2**level
high=2**(level+1)-1
#二叉查詢
while low0:
if bits & k == 0:
node=node.left
else:
node=node.right
bits >>=1
return node!=none
二叉樹的結點數
二叉樹的結點數 10分 已知二叉樹的結點結構定義如下 typedef struct node node 說明 data為資料域,均為英文大寫字母。lch和rch分別為指示左 右孩子的指標。請編寫函式,求二叉樹的結點個數。函式原型 結點數 int bintreenumnode const tnode ...
二叉樹 完全二叉樹的節點數
給定一棵完全二叉樹 最後一層所有節點都在最左側,其餘所有層節點數都為2 h 求其節點數。最簡單的方法就是遍歷一遍,把節點數加起來,但時間複雜度太高。以最左邊的路徑長作為二叉樹的高度,對於乙個節點,如果左子樹高度和右子樹高度一樣,說明左子樹為滿二叉樹,此時把其左子樹的節點數計算出來,加入總數,對右子樹...
完全二叉樹求節點數
如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹中共有4個...