對於讓你求二叉樹節點個數的題目,無非就是普通二叉樹、完全二叉樹、滿二叉樹三種。這三者的關係是,二叉樹》完全二叉樹》滿二叉樹。
如果是題目沒有給限定條件,只讓你求二叉樹的節點個數,則按照普通二叉樹來求;如果給了限定條件,完全二叉樹或者滿二叉樹,則根據他們的特性有更優化的演算法。
一、求普通二叉樹的節點個數
遞迴演算法和迭代演算法:
/*著重說一下這種遞迴演算法的時間複雜度是o(n)二、求滿二叉樹的節點個數* * definition for a binary tree node.
* struct treenode
* }; */
class
solution
}return
result;}};
滿二叉樹也是普通二叉樹,用求普通二叉樹節點個數的方法完全能夠得到正確答案,但是我們一開始說了,既然給定了這個條件,我們就能根據它的特性得到簡單的解法。
滿二叉樹的節點個數是跟二叉樹的深度有關係的,節點個數n=2^(深度)-1,根據這個特性,我們只需要知道二叉樹的深度,就能得到節點個數。
/*while迴圈只需要logn的時間,所以時間複雜度為o(logn)。三、求完全二叉樹的節點個數* * definition for a binary tree node.
* struct treenode
* }; */
class
solution
return (int)math.pow(2,h)-1
; }
};
完全二叉樹也是普通二叉樹,用求普通二叉樹節點個數的方法完全能夠得到正確答案,但是我們一開始說了,既然給定了這個條件,我們就能根據它的特性得到簡單的解法。
完全二叉樹的的兩棵子樹,至少有一顆是滿二叉樹。既然有這個特點,那這棵滿二叉樹就可以節省時間,另一棵當做普通二叉樹計算。
/*這個演算法的時間複雜度為o(lognlogn)。因為while迴圈的時間是o(logn),遞迴的時候因為上面提到的特性,只會遞迴一支子樹,遞迴深度就是樹的高度o(logn),所以總體的時間複雜度是o(lognlogn)。* * definition for a binary tree node.
* struct treenode
* }; */
class
solution
while(rightnode !=nullptr)
//如果左右子樹的高度相同,說明是一棵滿二叉樹
if(lh ==rh)
return pow(2,lh)-1
;
//如果高度不相等,按照普通二叉樹的計算邏輯
return
1+countnodes(root->left)+countnodes(root->right);}};
求完全二叉樹的節點個數
題目 給定乙個完全二叉樹的頭結點,求節點的個數。要求時間複雜度低於o n 思路 利用完全二叉樹的特點,分別求出左右子樹的高度l1,r1,如果l1 r1,則左子樹是滿二叉樹,根據高度直接求出節點 個數,接著遞迴右子樹。同理如果l1 r1,則右子樹是滿二叉樹,直接得到右子樹的節點個數,遞迴左子樹。pub...
求完全二叉樹的節點個數
已知一棵完全二叉樹,求其節點的個數 要求 時間複雜度低於o n n為這棵樹的節點個數 因為是完全二叉樹,除了最後一層都是填滿的,因此我們可以利用這個性質。首先求出這個二叉樹最大的高度,然後求其右子樹的最大高度,如果兩者是相等的,就說明左邊是填滿的,我們可以直接計算數量,否則的話就說明右面的最大高度是...
求二叉樹的高度,寬度 節點個數 葉子節點個數
include include include 實現求二叉樹的高度,寬度 節點個數 葉子節點個數 typedef struct node tnode,ptnode ptnode createtree else ptnode data data ptnode lchild createtree ptn...