簡體   English   中英

給定一個數 n 和 k,有多少棵具有 k 個葉子的平衡(高度平衡)二叉樹?

[英]Given a number n and k, how many balanced (height-balanced)binary trees with k leaves are there?

我們有 n 個節點和 k 個數字,我們如何計算(例如,使用動態規划)具有 n 個節點和 k 個葉子的所有高度平衡樹?

(高度平衡二叉樹是葉子高度最大差為1的樹。)

關於這些樹的假設/定義:

  • n 個“節點”; 每個都沒有孩子,只有左孩子,只有右孩子,或者既有左孩子又有右孩子。
  • k 個“葉子”,意思是沒有子節點的節點。
  • 如果樹的高度稱為h ,則少於兩個子節點的節點的深度都等於hh –1。 (這是平衡要求。)
  • 一棵樹完全由它的結構定義(哪些節點沒有孩子、左孩子、右孩子、左孩子和右孩子)。

鑒於上述情況,該樹由高度h的滿二叉樹-1在底層的一個或多個葉節點。 葉子的總數等於我們添加的葉子的數量,加上我們沒有添加任何孩子的上一層節點的數量。

因此,在高層次上,算法如下:

  • 計算底層有多少節點,上層有多少節點。 (這僅取決於n ;例如,高度為 6 的完整二叉樹有 2 6+1 –1 = 127 個節點,因此如果n = 130,則底層有 3 個節點,倒數第二層有 64 個節點。)
  • 計算倒數第二層有多少節點沒有孩子(即k減去最底層的節點數),其余有多少有一個孩子 vs. 兩個孩子(使用先前獲得的結果)。
  • 然后可以通過組合來確定可能的樹的總數。 具體來說,就是這三個值的乘積:
    • 從倒數第二行的節點中選擇沒有子節點的方法數:(倒數第二層的節點) nCr(倒數第二層沒有子節點的節點)
    • 從倒數第二行的剩余節點中選擇方法的數量,哪些節點有一個子節點:(倒數第二層的節點有一個或兩個子節點) nCr(倒數第二行的節點- 有一個孩子的底層)
    • 選擇方式的數量,從倒數第二行有一個孩子的節點中,哪些有左孩子,哪些有右孩子:2 (倒數第二行的節點有一個孩子)

在實現這一點時,一定要考慮到沒有給定nk值的樹的可能性; 對於任何給定的n ,對於滿足上述約束的樹,實際上只有特定范圍的k值是可能的。 如果k超出該范圍,則實現需要返回 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM