完全二叉樹節點個數

2021-09-07 18:35:33 字數 1297 閱讀 2661

關於作者

最簡單的解法就是遍歷這棵樹,時間複雜度是o(n),如果只是這一種解法,就不會有本文了。本文中給出兩種解法。

第一次看到完全二叉樹的定義比較懵,搜尋到的定義如下:

設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數,第h層所有的結點都連續集中在最左邊,這就是完全二叉樹。

誰到不想看這個定義,比較簡單的理解就是和滿二叉樹相比較,看按層次遍歷的標號是否一致。具體方案不再闡述,網上都有。

/**

* definition for a binary tree node.

* type treenode struct

*/

看一下遞迴的公式:

func countnodes(root *treenode) int 

suml := countnodes(root.left)

sumr := countnodes(root.right)

return suml+sumr+1

}

這個特點是什麼呢?完全二叉樹=滿二叉樹+完全二叉樹。完全二叉樹裡藏著一顆滿二叉樹和另外一顆完全二叉樹,最驚喜的是從公式裡看出子問題和原問題基本一致,可以使用遞迴啊。

完全二叉樹的層數

這種演算法的實現需要知道完全二叉樹的層數,難道又需要遍歷統計嗎,當然不需要了,還是借助完全二叉樹的特點,可以根據完全二叉樹的最左節點和乙個計數變數搞定,因為這個最左節點肯定是位於最後一層。

func height(root *treenode) int 

return h

}

原理

h-hright=2:

節點個數=1+左子樹節點個數+右子樹節點個數 = (1 << hright)+遞迴另一顆完全二叉樹(滿二叉樹 = 1 << hright)

第一種情況

第二種情況

實現

func countnodes(root *treenode) int 

return nodenums(root)

}func nodenums(root *treenode) int

return nums+countnodes(root.left)

}func height(root *treenode) int

return h

}

時間複雜度

對於每乙個節點最多需要訪問深度個數的節點,所以最終時間複雜度是o(lg2*lg2)。

leetcode 完全二叉樹節點個數

給出乙個完全二叉樹,求出該樹的節點個數。說明 完全二叉樹的定義如下 在完全二叉樹中,除了最底層節點可能沒填滿外,其餘每層節點數都達到最大值,並且最下面一層的節點都集中在該層最左邊的若干位置。若最底層為第 h 層,則該層包含 1 2h 個節點。此題為求樹中節點個數,可以直接使用遞迴方法計算樹中遍歷樹中...

判斷完全二叉樹節點個數

節點 struct node 銷毀二叉樹 void destroy tree node root destroy tree root left destroy tree root right delete root 找到左子樹樹的總高度 intget left level node node,int...

學習筆記 完全二叉樹節點個數

題目 統計完全二叉樹節點個數。觀察完全二叉樹的結構發現主要有如下幾種 規律就是要麼根節點的左子樹為滿二叉樹,要麼根節點的右子樹為滿二叉樹。思路 首先,如果當前節點的右子樹最左邊那個節點和二叉樹的層數 深度 一樣則說明該節點的左子樹為滿二叉樹,如上圖左邊所示,的確根節點的右子樹的最左邊那個節點所在層數...