先上題目
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 如果你心中的演算法沒有達到高效,那麼...