[Leetcode] Unique binary search trees ii 唯一二叉搜索树

Given n, generate all structurally unique BST's (binary search trees) that store values 1...n.

For example,
Given n = 3, your program should return all 5 unique BST's shown below.

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

 

confused what"{1,#,2,3}"means? > read more on how binary tree is serialized on OJ.


OJ's Binary Tree Serialization:

The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.

Here's an example:

   1
  / \
 2   3
    /
   4
    \
     5
The above binary tree is serialized as"{1,2,3,#,#,4,#,#,5}".

 题中很重要的一点是,各个结点的值是递增的,即非降型。所以,对任一点,其前的点构成二叉树的左子树,其后点构成二叉树右子树。可以从这两部分中随意的选取一部分组成子二叉树的左右子树。递归方法的思路是,遍历这n个数,然后从当前数的前后部分选取、组合成新的二叉树。终止条件是beg>end。感觉很哄哄的思想-水中的鱼的博客,用指针及堆来存储变量。

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<TreeNode *> generateTrees(int n) 
13     {
14         return creatTre(1,n);
15     }
16 
17     vector<TreeNode *> creatTre(int beg,int end)
18     {
19         vector<TreeNode *> res;
20         if(beg>end)
21         {
22             res.push_back(NULL);
23             return res;
24         }
25         for(int k=beg;k<=end;++k)
26         {
27             //求根节点i的左右子树集合
28             vector<TreeNode *> lTree=creatTre(beg,k-1);
29             vector<TreeNode *> rTree=creatTre(k+1,end);
30 
31             /*将左右子树相互匹配,每一个左子树都与所有右子树匹配,
32             *每一个右子树都与所有的左子树匹配  */
33             for(int i=0;i<lTree.size();++i)
34                 for(int j=0;j<rTree.size();++j)
35                 {
36                     TreeNode *root=new TreeNode(k);
37                     root->left=lTree[i];
38                     root->right=rTree[j];
39                     res.push_back(root);
40                 }
41         }
42         return res;
43     }
44 };

 

posted @ 2017-06-13 20:25  王大咩的图书馆  阅读(354)  评论(0编辑  收藏  举报