二分法計算完全二叉樹的節點數量

2021-10-10 20:04:02 字數 1007 閱讀 4691

先上題目

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

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

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

示例:輸入:

1/ \

2 3

/ \ /

4 5 6

輸出: 6

暴力遍歷二叉樹統計節點數量肯定可以,就是時間上差了指數級,bfs最快也要o(n),二分法可以做到o(log(n)*log(n))

二分法解法

題解參考:seu.fidget

完全二叉樹的高度可以直接通過不斷地訪問左子樹就可以獲取

判斷左右子樹的高度: 

如果相等說明左子樹是滿二叉樹, 然後進一步判斷右子樹的節點數(最後一層最後出現的節點必然在右子樹中)

如果不等說明右子樹是深度小於左子樹的滿二叉樹, 然後進一步判斷左子樹的節點數(最後一層最後出現的節點必然在左子樹中)

上**

public class solution 

int leftdepth = finddepth(root.left);

int rightdepth = finddepth(root.right);

if (leftdepth == rightdepth)

return (1 << rightdepth) + countnodes(root.left);

}private int finddepth(treenode n)

treenode t = n;

while (t != null)

return depth;}}

下面是解題思路

(完)

二分法與二叉查詢樹

二分查詢法 對乙個有序序列進行一分為二的檢索,每次查詢範圍縮小一半,直到找到所需的數或者查詢範圍不存在 問題描述 對乙個有序序列檢索乙個輸入的數,若該數存在則返回下標,否則返回1 問題分析 這種問題最簡單的方法是順序檢索,在資料量小的情況下,順序和二分還有二叉查詢樹沒有很大差別 此時是單邊樹 但在資...

二叉樹 完全二叉樹的節點數

給定一棵完全二叉樹 最後一層所有節點都在最左側,其餘所有層節點數都為2 h 求其節點數。最簡單的方法就是遍歷一遍,把節點數加起來,但時間複雜度太高。以最左邊的路徑長作為二叉樹的高度,對於乙個節點,如果左子樹高度和右子樹高度一樣,說明左子樹為滿二叉樹,此時把其左子樹的節點數計算出來,加入總數,對右子樹...

如何計算完全二叉樹的節點數

222.完全二叉樹的節點個數 如果讓你數一下一棵普通二叉樹有多少個節點,這很簡單,只要在二叉樹的遍歷框架上加一點 就行了。但是,如果給你一棵完全二叉樹,讓你計算它的節點個數,你會不會?演算法的時間複雜度是多少?這個演算法的時間複雜度應該是 o logn logn 如果你心中的演算法沒有達到高效,那麼...