题目1 Leetcode 98 链接 https://leetcode.com/problems/validate-binary-search-tree/#/description:
public:
vector<TreeNode *> generateTrees(int n) {
if(n<=0) return getTree(1,0);
return getTree(1,n);
}
vector<TreeNode *>getTree(int lower,int upper){
vector<TreeNode *> res;
if( lower> upper){
res.push_back(NULL);
return res;
}
for(int i= lower;i<= upper;i++){
vector<TreeNode*> left=getTree( lower,i-1);
vector<TreeNode*> right=getTree(i+1, upper);
for(int j=0;j<left.size();j++)
for(int k=0;k<right.size();k++){
TreeNode *cur=new TreeNode(i);
cur->left=left[j];
cur->right=right[k];
res.push_back(cur);
}
}
return res;
}
};
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
- The left subtree of a node contains only nodes with keys less than the node's key.
- The right subtree of a node contains only nodes with keys greater than the node's key.
- Both the left and right subtrees must also be binary search trees.
算法:
class Solution {
public:
bool isValidBST(TreeNode *root) {
return helper(root,INT_MIN,INT_MAX);
}
bool helper(TreeNode *root,int lower,int upper){
if(root==NULL) return true;
if(root->val<=lower||root->val>=upper) return false;
return helper(root->left,lower,root->val)&&helper(root->right,root->val,upper);
}
};
public:
bool isValidBST(TreeNode *root) {
return helper(root,INT_MIN,INT_MAX);
}
bool helper(TreeNode *root,int lower,int upper){
if(root==NULL) return true;
if(root->val<=lower||root->val>=upper) return false;
return helper(root->left,lower,root->val)&&helper(root->right,root->val,upper);
}
};
题目2:95 unique-binary-search-trees-ii
链接:https://leetcode.com/problems/unique-binary-search-trees-ii/#/description
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
算法:
public:
vector<TreeNode *> generateTrees(int n) {
if(n<=0) return getTree(1,0);
return getTree(1,n);
}
vector<TreeNode *>getTree(int lower,int upper){
vector<TreeNode *> res;
if( lower> upper){
res.push_back(NULL);
return res;
}
for(int i= lower;i<= upper;i++){
vector<TreeNode*> left=getTree( lower,i-1);
vector<TreeNode*> right=getTree(i+1, upper);
for(int j=0;j<left.size();j++)
for(int k=0;k<right.size();k++){
TreeNode *cur=new TreeNode(i);
cur->left=left[j];
cur->right=right[k];
res.push_back(cur);
}
}
return res;
}
};