全部查找树
要求
输出所有由数字1~n 组成的二叉搜索树。
eg:
n = 2
answer: 1(,2), 2(1)
解决思路
我们先从所有数字中取出一个作为根节点,那么剩下的数字按大小划分刚好能各自形成一棵二叉树(没有数字的那半用空指针代替)。因此,我们可以用相同的方式产生该根节点的子树的所有情况,最后把左子树和右子树的情况组合起来,每一种组合都是一棵新树,这样,在遍历完根节点的所有情况之后,就可以得到答案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| vector<Node*> BuildTrees(int s, int e){ if(s > e)return vector<Node*>(1, NULL); vector<Node*> trees; for(int i = s; i <= e; i++){ vector<Node*> left_trees = BuildTrees(s, i - 1); vector<Node*> right_trees = BuildTrees(i + 1, e); for(int j = 0; j < left_trees.size(); j++){ for(int k = 0; k < right_trees.size(); k++){ Node *root = new Node(i, NULL, NULL); root->left = left_trees[j]; root->right = right_trees[k]; trees.push_back(root); } } } return trees; }
vector<Node*> solution(int n){ return BuildTrees(1, n); }
C++
|