卡特蘭數 生成序列

2021-09-13 09:46:31 字數 1901 閱讀 9301

1.括號生成

左邊括號=右邊括號=n

每個右邊括號左邊至少有乙個左括號

def generate(n, left=0, right=0, result=''):

if left + right == 2 * n:

print result

return

if left < n:

generate(n, left+1, right, result+'(')

if left > right:

generate(n, left, right+1, result+')')

generate(3)

2.進出棧序列

def push_pop(nums, n, push=0, pop=0, stack=,result=):

if push + pop == 2*n:

print result

return

if push < n:

push_pop(nums, n, push+1, pop, stack[:], result)

stack.pop()

if push > pop:

push_pop(nums, n, push, pop+1, stack[:], result)

result.pop()

push_pop([1,2,3,4],4)

2.1-n產生的二叉搜尋樹

class node:

def __init__(self, val):

self.val = val

self.left = none

self.right = none

# 遍歷選取i為根,1-i-1為左子樹,i+1-n為右子樹,遞迴求解

def binary_search_tree(start, end):

if start > end:

return

roots =

for val in range(start, end+1):

lefts = binary_search_tree(start, val-1)

rights = binary_search_tree(val+1, end)

i = 0

j = 0

if not lefts and not rights:

root = node(val)

while i < len(lefts) and j < len(rights):

root = node(val)

root.left = lefts[i]

root.right = rights[j]

i += 1

j += 1

while i < len(lefts):

root = node(val)

root.left = lefts[i]

root.right = none

i += 1

while j < len(rights):

root = node(val)

root.left = none

root.right = rights[j]

j += 1

return roots

roots = binary_search_tree(1,3)

def preorder(root, vals=):

if root:

preorder(root.left, vals)

preorder(root.right, vals)

return vals

for root in roots:

print preorder(root, )

卡特蘭序列

在學習到資料結構 棧的時候,遇到棧的棧混洗情況,對於棧中n個元素,存在的情況為catalan數 在組合數學中發現卡特蘭數是怎麼來的 首先看乙個題目 對於n個 1和n個 1組成的2n個序列,a1,a2,a2n 滿足其部分和 a1 a2 a3 ak 0 k 1,2,2n 滿足這樣的序列的個數就等於第n個...

卡特蘭數,高精度卡特蘭數

簡單介紹 卡特蘭數是組合數學中常常出現的乙個數列。個人認為不管是遞推公式還是代表的含義都比斐波那契數列難理解一些。遞推公式 應用 1.cn表示長度2n的dyck word的個數。dyck word是乙個有n個x和n個y組成的字串。且全部的字首字串皆滿足x的個數大於等於y的個數。下面為長度為6的dyc...

卡特蘭數和超級卡特蘭數

這篇部落格主要是想講一下超級卡特蘭數 大施洛德數 順帶就想講一下卡特蘭數.卡特蘭數記為 c n c 1 1 forall n geq 2,c n sum c i c 前幾項大概是 1,1,2,5,14,42,132.直接遞推未免效率太低,我們考慮用生成函式優化.顯然有 c x c x 2 x 解得 ...