代码随想录算法训练营Day20 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树
LeetCode 654.最大二叉树
题目链接:LeetCode 654.最大二叉树
思路:
和后序、中序构建树的思路一致。
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(!nums.size()) return NULL;
int maxIndex = 0;
for(int i=0; i<nums.size(); i++){
if(nums[i]>nums[maxIndex]) maxIndex = i;
}
TreeNode* root = new TreeNode(nums[maxIndex]);
vector<int> leftnums(nums.begin(),nums.begin()+maxIndex);
vector<int> rightnums(nums.begin()+maxIndex+1,nums.end());
root->left = constructMaximumBinaryTree(leftnums);
root->right = constructMaximumBinaryTree(rightnums);
return root;
}
};
//无需定义新数组
class Solution {
public:
TreeNode* traversal(vector<int>& nums, int left, int right){
if(left>=right) return NULL;
int maxIndex = left;
for(int i = left+1; i<right;i++){
if(nums[i] > nums[maxIndex]) maxIndex = i;
}
TreeNode* root = new TreeNode(nums[maxIndex]);
root->left = traversal(nums,left,maxIndex);
root->right = traversal(nums,maxIndex+1,right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};
注意 :
- 比较简单,还可以输入left和right来优化
LeetCode 617.合并二叉树
题目链接:LeetCode 617.合并二叉树
思路:
1.分别处理左右树。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(!root1 && !root2) return NULL;
if(!root1 && root2) return root2;
if(root1 && !root2) return root1;
TreeNode* root = new TreeNode(root1->val+root2->val);
root->left = mergeTrees(root1->left, root2->left);
root->right = mergeTrees(root1->right, root2->right);
return root;
}
};
注意 :
- 思路较简单。 还可以优化为
if(!root1) return root2;
if(!root2) return root1;
LeetCode 700.二叉搜索树中的搜索
思路:
分为4种情况,空、等于,小于和大于
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(!root) return NULL;
if(root->val == val) return root;
if(root->val > val) return searchBST(root->left, val);
if(root->val < val) return searchBST(root->right, val);
return NULL;
}
};
LeetCode 98.验证二叉搜索树
题目链接:LeetCode 98.验证二叉搜索树
思路:
1.用中序遍历,检验数组是否单调递增
class Solution {
public:
vector<int> vec;
void traversal(TreeNode* root){
if(!root) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
bool isValidBST(TreeNode* root) {
traversal(root);
if(vec.size()==0 || vec.size()==1) return true;
for(int i=1; i<vec.size(); i++){
if(vec[i]<=vec[i-1]) return false;
}
return true;
}
};
注意 :
- 注意需要 vec.clear();