题目链接:654. 最大二叉树 - 力扣(LeetCode)
class Solution
{
public:
TreeNode *constructMaximumBinaryTree(vector<int> &nums)
{
if(nums.size()==0) return nullptr;
int max=INT_MIN;
int i=0;
for(i=0;i<nums.size();i++){
if(nums[i]>max){
max=nums[i];
}
}
for(i=0;i<nums.size();i++){
if(nums[i]==max) break;
}
vector<int> left(nums.begin(),nums.begin()+i);
vector<int> right(nums.begin()+i+1,nums.end());
TreeNode *root=new TreeNode(max);
root->left=constructMaximumBinaryTree(left);
root->right=constructMaximumBinaryTree(right);
return root;
}
};
和昨天中序后序构造二叉树有异曲同工之妙,有了昨天的经验,顺利做出来了。
总之就是找到最大值,然后分割数组,分别把左右数组进递归就行。
题目链接:617. 合并二叉树 - 力扣(LeetCode)
class Solution
{
public:
TreeNode *mergeTrees(TreeNode *root1, TreeNode *root2)
{
TreeNode *root=new TreeNode();
if(!root1&&!root2) return nullptr;
else if(root1&&root2){
root->val=root1->val+root2->val;
root->left=mergeTrees(root1->left,root2->left);
root->right=mergeTrees(root1->right,root2->right);
}else if(root1){
root->val=root1->val;
root->left=mergeTrees(root1->left,nullptr);
root->right=mergeTrees(root1->right,nullptr);
}else{
root->val=root2->val;
root->left=mergeTrees(root2->left,nullptr);
root->right=mergeTrees(root2->right,nullptr);
}
return root;
}
};
递归方法解决。通过这几天的递归练习,逐渐掌握了一些思想。
两个树同时找结点,如果都存在就相加,如果一方不存在就用另一方,如果都不存在就返回空。
题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == NULL || root->val == val) return root;
TreeNode* result = NULL;
if (root->val > val) result = searchBST(root->left, val);
if (root->val < val) result = searchBST(root->right, val);
return result;
}
};
二叉搜索树就是小的在根节点左边,大的在根节点右边。
判断是否为空或等于要找的值,然后返回根节点,这个就是要找的,也是找到对应的值的返回。
单层判断逻辑就是当前结点大于要val,就往左找,小于就往右找。return结果回来就行。最后通过 result一层层把值传递。
题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)
class Solution {
public:
TreeNode* pre = NULL; // 用来记录前一个节点
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);//二叉搜索树的中序遍历是递增的
if (pre != NULL && pre->val >= root->val) return false;
pre = root; // 记录前一个节点
bool right = isValidBST(root->right);
return left && right;
}
};
二叉搜索树的中序遍历是递增的。按这个逻辑来中序遍历就能解题。
定义一个类属性能辅助我们解题,类似于acm里面可以定义一个全局变量。