不同的二叉查詢樹:
不同的二叉查詢樹 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個數依次入棧,出棧順序有多少種?",同樣用的也是卡特蘭數。
classsolution
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個整數,表示該二叉樹的層次遍歷...