帮师兄做的一个问题,就是求对n个不同节点能够形成所有的二叉树的形式,不考虑旋转对称性和同构。
问题描述:给定n个节点,查看能够有多少种不同的二叉树形成,并输出出来
算法描述:使用最基本的“分治法“(Divide and Conquer)思想,任选一个节点作为根节点,将剩余节点组成的集合进行分割(Partition),一部分放到左子树进行递归,另一部分放到右子树递归。重点为两部分:一部分使用二进制对集合进行分割,其实就是就集合的”幂集“,另一部分是如何存储。另外还可以进行暴力搜索。
测试用例:n=3,能够形成30种不同二叉树。
代码:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector< string > generate_tree(const vector< string > &nodes) {
if (nodes.empty()) {
return vector< string >{"*"};
} else if (1 == nodes.size()) {
return vector< string >{nodes[0]};
}
vector< string > trees, tmp, left, right, l_tree, r_tree;
for (size_t i = 0; i <