654.最大二叉树
注意划分数组时候区间的边界。应该是左闭右开!
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode *node=new TreeNode(0);
if(nums.size()==1)
{
node->val=nums[0];
return node;
}
int max=0;
int index=0;
for(int i=0;i<nums.size();i++)
{
if(nums[i]>max)
{
max=nums[i];
index=i;
}
}
node->val=max;
if(index>0)
{
vector<int> vec(nums.begin(),nums.begin()+index);
node->left=constructMaximumBinaryTree(vec);
}
if(index<nums.size()-1)
{
vector<int> vec(nums.begin()+index+1,nums.end());
node->right=constructMaximumBinaryTree(vec);
}
return node;
}
};
617.合并二叉树
看起来很懵,但其实很简单的一道题。我们前中后序遍历都可以,保证两棵树遍历的次序一样就好了。要注意的是处理好终止条件。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1==nullptr) return root2;
if(root2==nullptr) return root1;
root1->val+=root2->val;
root1->left=mergeTrees(root1->left,root2->left);
root1->right=mergeTrees(root1->right,root2->right);
return root1;
}
};
700.二叉搜索树中的搜索
这道题来说可能迭代法会比递归法更好理解也更好写。但是其实都还是很简单的。
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root==nullptr)
return nullptr;
if(val>root->val)
return searchBST(root->right,val);
if(val<root->val)
return searchBST(root->left,val);
return root;
}
};
98.验证二叉搜索树
要用到二叉搜索树的一个性质,中序遍历节点的值是升序的,我们只需要一个指针来保留前一层的节点然后比较就好了。
class Solution {
public:
TreeNode *pre=nullptr;
bool isValidBST(TreeNode* root) {
if(root==nullptr) return true;
bool left=isValidBST(root->left);
if(pre!=nullptr&&pre->val>=root->val)
return false;
pre=root;
bool right=isValidBST(root->right);
return left&&right;
}
};