已知一棵完全二叉樹,求其節點的個數
要求:時間複雜度低於o(n),n為這棵樹的節點個數
若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。首先判斷根節點的右子樹的左邊界。
左子樹的左邊界在最後一層。
左子樹為滿二叉樹,高度為lh=h-1。那麼左子樹的節點個數為(1 << lh) - 1也就是2的lh次方減一。
2. 右子樹的左邊界沒到最後一層
- 右子樹為滿二叉樹,但是高度比左子樹小1
- 所有節點數 = 右子樹 + 根節點 + 左子樹
如何計算:
情況1的時候,左子樹為滿二叉樹,左子樹節點為(1 << 左子樹高度) - 1,加上根節點1,右子樹此時為滿二叉樹。
所有節點數 = (1 << 左子樹高度) + 右子樹節點數(遞迴計算)
情況2的時候,同理。
public
class
completetreenodenumber
}public
static
intnodenum
(node head)
/** * @param node 當前節點
* @param level 層次
* @param h 整棵樹的高度
* @return 樹的所有節點數量
*/public
static
intbs
(node node,
int level,
int h)if(
heightoftree
(node.right, level +1)
== h)
else
}private
static
intheightoftree
(node head,
int level)
return level -1;
}}
二叉樹 求一棵完全二叉樹節點的個數
已知一棵完全二叉樹,求其節點的個數 要求 時間複雜度低於o n n為這棵樹的節點個數 結論 滿二叉樹 高度為l,結點個數 2 l 1個 先遍歷左邊界,求出完全二叉樹的高度h 然後遍歷樹的右子樹的左邊界,看它到沒到最後一層,如果到了最後一層,那麼證明它的左子樹是滿的,高度是h 1 左子樹的結點數2 h...
求完全二叉樹的節點個數
題目 給定乙個完全二叉樹的頭結點,求節點的個數。要求時間複雜度低於o n 思路 利用完全二叉樹的特點,分別求出左右子樹的高度l1,r1,如果l1 r1,則左子樹是滿二叉樹,根據高度直接求出節點 個數,接著遞迴右子樹。同理如果l1 r1,則右子樹是滿二叉樹,直接得到右子樹的節點個數,遞迴左子樹。pub...
求完全二叉樹的節點個數
已知一棵完全二叉樹,求其節點的個數 要求 時間複雜度低於o n n為這棵樹的節點個數 因為是完全二叉樹,除了最後一層都是填滿的,因此我們可以利用這個性質。首先求出這個二叉樹最大的高度,然後求其右子樹的最大高度,如果兩者是相等的,就說明左邊是填滿的,我們可以直接計算數量,否則的話就說明右面的最大高度是...