📜  二叉树的枚举

📅  最后修改于: 2022-05-13 01:57:17.006000             🧑  作者: Mango

二叉树的枚举

如果每个节点都被分配了标签,则二叉树被标记,如果节点没有被分配任何标签,则二叉树未被标记。

Below two are considered same unlabelled trees
    o                 o
  /   \             /   \ 
 o     o           o     o 

Below two are considered different labelled trees
    A                C
  /   \             /  \ 
 B     C           A    B 

n 个节点可以有多少种不同的未标记二叉树?

For n  = 1, there is only one tree
   o

For n  = 2, there are two trees
   o      o
  /        \  
 o          o

For n  = 3, there are five trees
    o      o           o         o      o
   /        \         /  \      /         \
  o          o       o    o     o          o
 /            \                  \        /
o              o                  o      o

这个想法是考虑左右子树中节点的所有可能的计数对,并将特定对的计数相乘。最后,将所有对的结果相加。

For example, let T(n) be count for n nodes.
T(0) = 1  [There is only 1 empty tree]
T(1) = 1
T(2) = 2

T(3) =  T(0)*T(2) + T(1)*T(1) + T(2)*T(0) = 1*2 + 1*1 + 2*1 = 5

T(4) =  T(0)*T(3) + T(1)*T(2) + T(2)*T(1) + T(3)*T(0)
     =  1*5 + 1*2 + 2*1 + 5*1 
     =  14 

上面的模式基本上代表了第 n 个加泰罗尼亚数字。前几个加泰罗尼亚数字是 1 1 2 5 14 42 132 429 1430 4862,...
T(n)=\sum_{i=1}^{n}T(i-1)T(n-i)=\sum_{i=0}^{n-1}T(i)T(n-i-1)=C_n
这里,
T(i-1) 表示左子树上的节点数
T(n−i-1) 表示右子树上的节点数

第 n 个加泰罗尼亚数也可以使用直接公式计算。

T(n) = (2n)! / (n+1)!n!

具有 n 个节点的二叉搜索树 (BST) 的数量也与未标记树的数量相同。原因很简单,在 BST 中我们也可以将任何键设为根,如果根是排序顺序中的第 i 个键,则 i-1 个键可以放在一侧,而 (ni) 键可以放在另一侧边。

n 个节点可以有多少个带标签的二叉树?
要计算标记的树,我们可以将上述计数用于未标记的树。这个想法很简单,每棵具有 n 个节点的未标记树都可以创建 n!通过为所有节点分配不同的标签排列来创建不同的标签树。

所以,

Number of Labelled Trees = (Number of unlabelled trees) * n!
                       = [(2n)! / (n+1)!n!]  × n!

例如对于 n = 3,有 5 * 3! = 5*6 = 30 种不同的标记树