演算法筆記-完全二叉樹個數計算(時間複雜度小於O(n))
阿新 • • 發佈:2021-06-27
------------恢復內容開始------------
首先科普一個事實,對於一個滿二叉樹來說,節點個數=(1<< (高度))-1。
接下來我們看這道題,管他三七二十一,前面那麼多樹的遍歷,直接搞起,可他丫的還有一個限制條件:時間複雜度小於O(n),那就把這條路堵死了,算了算了,先看圖分析一下:
我們仔細觀察可以發現,完全二叉樹的左右子樹必有一個為滿二叉樹對於4:右子樹,對於2:左子樹,對於3左子樹只有一個節點,單個節點也是滿二叉樹,分析到這裡大體思路是有了,還有一個問題就是如何判斷當前哪邊是滿二叉樹?有一個小技巧:看右子樹的最左節點高度是否和整棵樹一樣,程式碼如下:
public static int CTNum(Node node){ if(node == null){ return 0; } return CTNum(node,deep(node,0),0); } public static int CTNum(Node node,int deep, int level){ if(deep == level){ return 1; } if(deep(node.right,level+1) == deep){return CTNum(node.right,deep,level+1) + (1<<(deep-level)); }else{ return CTNum(node.left,deep,level+1) + (1<<(deep-level-1)); } } private static int deep(Node right, int level) { while(right != null){ level++; right = right.left; }return level-1; }
這裡滿二叉樹在左邊和右邊有一個區別,因為是從左向右排的,若在右邊,則會少一行。