n個結點,不同形態的二叉樹(數目 生成)

2021-09-20 14:14:19 字數 2758 閱讀 8927

不同的二叉查詢樹:

不同的二叉查詢樹 ii:

給出n = 3,有5種不同形態的二叉查詢樹:

1           3    3       2      1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

可以分析,當n=1時,只有1個根節點,則只能組成1種形態的二叉樹,令n個節點可組成的二叉樹數量表示為h(n),則h(1)=1; h(0)=0;

當n=2時,1個根節點固定,還有2-1個節點。這乙個節點可以分成(1,0),(0,1)兩組。即左邊放1個,右邊放0個;或者左邊放0個,右邊放1個。即:h(2)=h(0)*h(1)+h(1)*h(0)=2,則能組成2種形態的二叉樹。

當n=3時,1個根節點固定,還有2個節點。這2個節點可以分成(2,0),(1,1),(0,2)3組。即h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=5,則能組成5種形態的二叉樹。

以此類推,當n>=2時,可組成的二叉樹數量為h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0)種,即符合catalan數的定義,可直接利用通項公式得出結果。

令h(1)=1,h(0)=1,catalan數(卡特蘭數)滿足遞迴式: 

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)

另類遞迴式:

h(n)=((4*n-2)/(n+1))*h(n-1);

該遞推關係的解為:

h(n)=c(2n,n)/(n+1) (n=1,2,3,...)

由此想到了上次說的"n個數依次入棧,出棧順序有多少種?",同樣用的也是卡特蘭數。

class

solution

return

ans;

}int numtrees(int

n) };

給出n = 3,生成所有5種不同形態的二叉查詢樹:

1         3     3       2    1

\ / / / \ \

3 2 1 1 3 2

/ / \ \

2 1 2 3

其實通過樣例,我們可以發現n個結點構造不同形態二叉樹的過程,1,2,3.....n個結點,列舉每乙個結點為根結點(假設為root, 1<=root<=n), 那麼(1,2..root-1)和(root+1, root+2...n)分別是root的左右子樹。每一步不斷地重複上述過程,最終會得到所有形態的二叉樹。

先弱弱的說一下自己錯誤的實現,因為遞迴實現的時候會得到不同的二叉樹,那麼如何判斷n個結點正好生成了二叉樹呢?於是用了乙個變數usenode(=0),表示當前已經用了多少個結點建樹。當usenode等於n的時候說明產生了一棵符合要求的樹,接著拷貝一下剛才生成的樹,然後放入vector中,繼續建造下一棵符合條件的二叉樹。

/*

* * definition of treenode:

* class treenode

* } */

class

solution

}void buildt(treenode * &t, int ld, int rd, int

usenode)

buildt(t->left, ld, root-1, usenode+1

); buildt(t->right, root+1, rd, usenode+root-ld+1

); }

}vector

generatetrees(int

n) };

後來執行之後,看到錯誤的答案與正確答案的對比,如下:

當n=4的時候
輸出

[,,,,,,,,,,,,]
期望答案

[,,,,,,,,,,,,,]
也就是少了,以3為根結點的二叉樹為什麼會少了呢?仔細想想,3結點的左孩子可以是1,也可以是2,那麼左孩子為1的情況就被忽略了,此時usenode並不等於n,然後就換成左孩子為2結點的情況了。

/*

* * definition of treenode:

* class treenode

* } */

class

solution

if(ld >rd)

for(int i=ld; i<=rd; ++i)

}return

ans;

}vector

generatetrees(int

n) };

分析:在確定當前結點x後,那麼x的左孩子結點(或右孩子結點)可能會有多個,那麼就把這些可能的結點都存到vector中,然後從左孩子集合中任選出lx結點,以及從右孩子集合中選出rx結點,那麼lx和rx就確定了一種形態的二叉樹。

n個結點,不同形態的二叉樹(數目 生成)

不同的二叉查詢樹 不同的二叉查詢樹 ii 給出n 3,有5種不同形態的二叉查詢樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3可以分析,當n 1時,只有1個根節點,則只能組成1種形態的二叉樹,令n個節點可組成的二叉樹數量表示為h n 則h 1 1 h 0 0 當n 2時,1個根節點固定...

n個結點,不同形態的二叉樹(數目 生成)

不同的二叉查詢樹 不同的二叉查詢樹 ii 給出n 3,有5種不同形態的二叉查詢樹 1 3 3 2 1 3 2 1 1 3 2 2 1 2 3可以分析,當n 1時,只有1個根節點,則只能組成1種形態的二叉樹,令n個節點可組成的二叉樹數量表示為h n 則h 1 1 h 0 0 當n 2時,1個根節點固定...

二叉樹的不同形態

題目 二叉樹的不同形態 問題描述 給定二叉樹t 樹深度h 10,深度從1開始,結點個數n 1024,結點編號1 n 的層次遍歷序列和中序遍歷序列,輸出t從左向右葉子結點以及二叉樹先序和後序遍歷序列。輸入格式 輸入共三行 第一行是整數n,表示二叉樹中的結點數目 第二行有n個整數,表示該二叉樹的層次遍歷...