1. 程式人生 > >LeetCode: 95. Unique Binary Search Trees II(Week 11)

LeetCode: 95. Unique Binary Search Trees II(Week 11)

95. Unique Binary Search Trees II

  • 題目

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

    Example:

    Input: 3
      Output:
      [
        [1,null,3,2],
        [3,2,null,1],
        [3,1,null,null,2],
        [2,1,3],
        [1,null,2,null,3]
      ]
      Explanation:
      The above output corresponds to the 5 unique BST's shown below:
      
         1         3     3      2      1
          \       /     /      / \      \
           3     2     1      1   3      2
          /     /       \                 \
         2     1         2                 3
      
  • 題解
    • 本題的題意比較簡單,給出二叉搜尋樹的節點數目n,求出可以構成多少中不同結構的二叉搜尋樹。
    • 其實實現起來還是比較簡單的。對於其中一個節點i,將其作為該樹的根節點,然後其左邊的元素都作為其左子樹的元素,右邊的元素都作為其右子樹的元素,再通過遞迴得到其左子樹和右子樹的可能出現的情況的集合,然後再組合起來。一些需要注意的情況:
      • 遞迴的結束條件: 當該子樹的起點大於終點的時候 – start > end,遞迴結束,能夠生成子樹的情況為無,即為NULL
      • 對得到的左子樹和右子樹的返回情況需要判斷其是否為空(可能沒有不存在左或右節點的情況),如果不存在,需要推入一個NULL,然後再進行組合,否則遍歷組合的時候left.size * right.size = 0
        ,將導致結果不全,只有左右子樹都存在的結果。
  • 實現程式碼
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<TreeNode*> generateTrees(int n) {
    if(!n) return vector<TreeNode*>(); vector<TreeNode*> v = myGenerate(1, n); return v; } vector<TreeNode*> myGenerate(int start, int end) { vector<TreeNode*> v; if(start > end) return v; for(int i = start; i <= end; ++i) { vector<TreeNode*> left = myGenerate(start, i-1); vector<TreeNode*> right = myGenerate(i + 1, end); if(!left.size()) left.push_back(NULL); if(!right.size()) right.push_back(NULL); for(int j = 0; j < left.size(); ++j) { for(int k = 0; k < right.size(); ++k) { TreeNode* node = new TreeNode(i); node->left = left[j]; node->right = right[k]; v.push_back(node); } } } return v; } };