1. 程式人生 > 其它 >演算法筆記-完全二叉樹個數計算(時間複雜度小於O(n))

演算法筆記-完全二叉樹個數計算(時間複雜度小於O(n))

------------恢復內容開始------------

  首先科普一個事實,對於一個滿二叉樹來說,節點個數=(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; }

這裡滿二叉樹在左邊和右邊有一個區別,因為是從左向右排的,若在右邊,則會少一行。