求二叉樹的節點個數總結

2022-07-08 06:30:15 字數 1849 閱讀 1457

對於讓你求二叉樹節點個數的題目,無非就是普通二叉樹、完全二叉樹、滿二叉樹三種。這三者的關係是,二叉樹》完全二叉樹》滿二叉樹。

如果是題目沒有給限定條件,只讓你求二叉樹的節點個數,則按照普通二叉樹來求;如果給了限定條件,完全二叉樹或者滿二叉樹,則根據他們的特性有更優化的演算法。

一、求普通二叉樹的節點個數

遞迴演算法和迭代演算法:

/*

* * definition for a binary tree node.

* struct treenode

* }; */

class

solution

}return

result;}};

著重說一下這種遞迴演算法的時間複雜度是o(n)二、求滿二叉樹的節點個數

滿二叉樹也是普通二叉樹,用求普通二叉樹節點個數的方法完全能夠得到正確答案,但是我們一開始說了,既然給定了這個條件,我們就能根據它的特性得到簡單的解法。

滿二叉樹的節點個數是跟二叉樹的深度有關係的,節點個數n=2^(深度)-1,根據這個特性,我們只需要知道二叉樹的深度,就能得到節點個數。

/*

* * definition for a binary tree node.

* struct treenode

* }; */

class

solution

return (int)math.pow(2,h)-1

; }

};

while迴圈只需要logn的時間,所以時間複雜度為o(logn)。三、求完全二叉樹的節點個數

完全二叉樹也是普通二叉樹,用求普通二叉樹節點個數的方法完全能夠得到正確答案,但是我們一開始說了,既然給定了這個條件,我們就能根據它的特性得到簡單的解法。

完全二叉樹的的兩棵子樹,至少有一顆是滿二叉樹。既然有這個特點,那這棵滿二叉樹就可以節省時間,另一棵當做普通二叉樹計算。

/*

* * 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(lognlogn)。因為while迴圈的時間是o(logn),遞迴的時候因為上面提到的特性,只會遞迴一支子樹,遞迴深度就是樹的高度o(logn),所以總體的時間複雜度是o(lognlogn)。

求完全二叉樹的節點個數

題目 給定乙個完全二叉樹的頭結點,求節點的個數。要求時間複雜度低於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...