我沒有檢查所有的鏈接,但在我看來,他們中的一些人有一些有用的想法。爲了回答你的問題,不,我不知道一個算法,但我不認爲設計一個算法會很困難。
List<TreeNode> allBinaryTrees(int numberOfLeaves) {
if (numberOfLeaves < 1) {
throw new IllegalArgumentException("Number of leaves must be positive");
}
List<TreeNode> result = new ArrayList<>();
if (numberOfLeaves == 1) {
// return a single tree consisting of a single leaf node
result.add(new Leaf());
return result;
}
for (int sizeOfLeftSubtree = 1; sizeOfLeftSubtree < numberOfLeaves - 1; sizeOfLeftSubtree++) {
List<TreeNode> possibleLeftSubtrees = allBinaryTrees(sizeOfLeftSubtree);
List<TreeNode> possibleRightSubtrees = allBinaryTrees(numberOfLeaves - sizeOfLeftSubtree);
for (TreeNode lt : possibleLeftSubtrees) {
for (TreeNode rt : possibleRightSubtrees) {
// make a tree of a node with lt and rt as subtrees,
// and add it to the result
result.add(new InternalNode(lt, rt));
}
}
}
return result;
}
在上述我假定InternalNode
Leaf
和是的兩個TreeNode
子類。你可能想要一個不同的設計。我希望你可以相應地調整代碼。
只是想知道:你想通過計算二叉樹中對象的可能「排列」來解決什麼問題? – GhostCat
@GhostCat也許他試圖找到「最佳」迭代?但是再次,解決這個問題的方法只是爲了平衡這棵樹 –
@GhostCat的權利,好吧,我正在爲一款遊戲構建一個Ai,我們希望它具有所有可能性,但是在後期遊戲放棄無用的樹木。 – Enixf