Haskell 二叉樹和Catalan數

2021-10-01 12:33:00 字數 1385 閱讀 9539

catalan數:c(2n, n)=(2n)!/n!/n!

關於n個節點二叉樹種類數和catalan數的關係,可閱讀這篇部落格。

data tree = leaf | node tree tree deriving show

-- 這裡的leaf不是代表葉子節點,而是代表根本沒有

-- 這裡的node不需要預先定義,而只是乙個名字;這個名字本身沒有任何意義,出現在模式匹配裡面才存在意義。

-- 如果結點需要包含資訊,也是用模式匹配的方式追加在裡面。比如:

-- data tree = leaf | node int tree tree deriving show -- 注意裡面的int

以上定義了「結點不需要包含任何資訊」的二叉樹。

為剛剛定義的二叉樹資料結構定義乙個列印其資訊的函式:

-- brace的幾種定義方式

-- 1.空的分支用沒有表示,非空的分支用括號括起來

brace :: tree -> string

brace leaf = ""

-- brace leaf = "*" -- 空的分支用*表示

brace (node ltree rtree) = "(" ++ brace ltree ++ "," ++ brace rtree ++ ")"

-- 2.左括號跟左子樹,右括號跟右子樹

-- 這種定義方式對應的實際情景:n對括號,合理的括號巢狀有多少種情形,這個問題的答案也是catalan數。

brace :: tree -> string

brace leaf = ""

brace (node ltree rtree) = "(" ++ brace ltree ++ ")" ++ brace rtree

樹的列印方式千變萬化,根據需要的視覺效果自己把握。

求解「包含n個節點的二叉樹的種類數」:使用分治法求解,f(n) = f(n-1)f(0) + f(n-2)f(1) + f(n-3)f(2) + ... + f(1)f(n-2) + f(n-1)f(0)

trees :: int -> [tree] -- 返回所有不重複的包含n個結點的二叉樹的列表

trees 0 = [leaf]

trees n = [node ltree rtree | l <- [0 .. n-1], ltree <- trees l, rtree <- trees (n-1-l)]

列表長度即為所求:執行length $ trees n

執行map brace $ trees n,返回乙個列表,展示所有的樹的表示。

參考:魔力haskell

二叉樹 滿二叉樹和完全二叉樹

二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...

二叉樹和完全二叉樹

二叉樹規律 假設根節點的高度為0 二叉樹是每個節點至多只有兩個節點的樹 深度為i所在的層至多有 2 i個節點 高度為k的二叉樹至多有2 k 1 1個節點 n0表示度為0的節點,n2表示度為2的節點,存在n0 n2 1 對所有樹有 節點個數 邊數 1 完全二叉樹規律 節點數為n的完全二叉樹,其高度為 ...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...