654.最大二叉树
思想:遍历一下这个数组找到最大值,根据该值的下标将数组分为两部分:左侧数组组成的左子树和右侧数组组成的右子树。这两个子树也应该分别是最大二叉树。所以采用相同的方法构造左孩子的最大二叉树和右孩子的最大二叉树。将这两个新的数组递归地带入函数,把节点返回,最后得到结果。
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if(nums.size()==0) return nullptr;//一会改成size = 1
vector<int> temp(nums.begin(),nums.end());
sort(temp.begin(),temp.end());
TreeNode* root = new TreeNode(temp[temp.size()-1]);
//找到最大值的下标
int count = 0;
//找下标
for(count=0;nums[count]!=temp[temp.size()-1];count++);
vector<int> newleft(nums.begin(),nums.begin()+count);
vector<int> newright(nums.begin()+count+1,nums.end());
//新的左数组
//新的右数组
root->left = constructMaximumBinaryTree(newleft);
root->right = constructMaximumBinaryTree(newright);
return root;
}
};
617.合并二叉树
难点:分情况讨论新树的相同位置的节点应该怎么赋值:左右都为空、左空右不空、右空左不空、左右都不空。分清楚这些情况,题就好做了,除此之外还可以加深自己对于递归的理解。
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
TreeNode* root = new TreeNode;
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 if (root2){
root->val = root2->val;
root->left = mergeTrees(nullptr, root2->left);
root->right = mergeTrees(nullptr, root2->right);
}
else
return nullptr;
return root;
}
};
700.二叉搜索树中的搜索
思想:根据给出的val和根节点的值比较,相等则返回该节点,大于则分析右子树,小于则分析左子树。如果访问到叶子节点时val还是和这个节点的值不相等,则返回空指针。
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(!root) return nullptr;
if(root->val==val) return root;
else if(val>root->val) return searchBST(root->right,val);
else return searchBST(root->left,val);
}
};
98.验证二叉搜索树
思想:二叉搜索树在中序遍历的情况下访问节点的值是逐渐增大的,所以只需要设置一个指针指向当前访问节点的前一个节点,判断这两个节点值的大小关系即可判断是否为二叉搜索树。
class Solution {
public:
bool isValidBST(TreeNode* root) {
vector<int> ans;
function(ans,root);
vector<int>ans2(ans.begin(),ans.end());
sort(ans2.begin(),ans2.end());
for(int i = 0; i<ans.size()-1;i++){
if(ans[i]==ans[i+1]) return false;
}
for(int i = 0; i<ans.size();i++){
if(ans[i]!=ans2[i]) return false;
}
return true;
}
void function(vector<int>& ans,TreeNode* root){
if(root==nullptr) return;
function(ans,root->left);
ans.push_back(root->val);
function(ans,root->right);
}
};