注意:做2的冪時不要用math.pow,這樣會超時。用1<< a 這個方法來得到2的a次冪!!!
參考:二分法,c++)
(遞迴)
【題目】
給定一棵完全二叉樹的根節點root,返回這棵樹的節點個數。如果完全二叉樹的節點數為n,請實現時間複雜度低於o(n)的解法。
給定樹的根結點root,請返回樹的大小。
思路:計算完全二叉樹最左節點的位置,目的是計算出二叉樹的高度,然後再找到右子樹的最左節點的位置與之做比較,則有以下兩種情況:
1) 如果右子樹的最左節點剛好到達最下面的一層的話(如下圖),那麼說明該樹的左子樹是一顆滿二叉樹,那麼可以根據二叉樹的性質計算出左子樹的節點個數,再加上根節點,剩下需要計算的就是右子樹的個數了,採用遞迴的方式。
2)如果右子樹的最左節點不能到達最下面的一層的話(如下圖),說明右子樹也是一顆滿二叉樹,只是層數少了,同理,根據二叉樹的性質計算出右子樹的節點個數,再加上根節點的,剩下的只需計算左子樹節點個數,同樣採用遞迴方式。
這種方式的複雜度肯定比遍歷的複雜度低。
遍歷的方式,時間複雜度是o(n)
採用這種方式,時間複雜度為o((logn)^2),即二叉樹高度的平方。
其實這種方法的思想是二分思想,其實就是在看完全二叉樹最後一層的最右節點到底處在什麼樣的位置上。
public class countcompletebinarytreenodes }
//計算完全二叉樹的層數
public int getdepth(treenode root)
return dep; }
//統計完全二叉樹的節點個數
public int countnodes(treenode root)
right_left_level++; //加上根節點原本的一層
if(left_left_level==right_left_level)
else }
}
完全二叉樹子節點個數
題目 乙個具有n個節點的完全二叉樹,其葉子節點的個數為多少?分析 設葉子節點個數為n0,度為1的節點個數為n1,度為2的節點個數為n2 側有 n0 n1 n2 n 1 對於二叉樹有 n0 n2 1 2 由 1 2 n0 n 1 n1 2 3 由完全二叉樹的性質可知 n1 0 或 1總結 a 當n1 ...
完全二叉樹的節點個數
給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。示例 輸入 1 2 3 4 5 6 輸出 6 defini...
完全二叉樹的節點個數
222.完全二叉樹的節點個數 演算法 如果左子樹高度和右子樹高度相等,說明左子樹是滿二叉樹,節點個數為 如果左子樹高度和右子樹高度不相等,說明右子樹是滿二叉樹,節點個數為 如下 definition for a binary tree node.public class treenode class...