Day 18
哎,日子越来越近了,干什么都干不下去,但又必须要坚持。前途渺茫…
一、理论学习
1)自己误打误撞的时候,学习函数
int partition=max_element(nums.begin(),nums.end())-nums.begin();
也记录一下我的错误做法,说不定回看能补下去
void settree(vector<int>& nums,int start,int end,vector<TreeNode*>&res){int partition=max_element(nums.begin(),nums.end())-nums.begin();TreeNode* temp=new TreeNode(nums[partition]);res.push_back(temp);if(partition==0) {res.push_back(nullptr);return;}settree(nums,0,partition-1,res);if(partition==nums.size()){res.push_back(nullptr);return;}settree(nums,partition+1,nums.size(),res);}
2)617
)98
要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
#递归法
二、刷题部分
654. 最大二叉树 - 力扣(LeetCode)
好,到这里我明白了问题出在哪里。 我将分为以下几个点来进行讲解:
\1) 首先我想说这道题目和快速排序的一个相似性,那如果我们写过快排的代码,看到这里就应该非常熟悉。
\2) 第二点,我想说我贴出来的这个错误解法错在哪里? 错就错在我对这个划分的一个边界的错误。 那我们可以看到我们在传入的时候是传入了左边界和右边界两个值的。我们最初传入的就是我们整个数组的最左和最右,但是随着我们不断的去划分,每一次的左边界和右边界是不一样的.如果我一直传入的是零和那个最大值就会出错。
\3) 那第三点我想讲的就是我们对这个左闭右开合左开右闭的这个一致性的再一次强调在这里又遇到了哦,因为这两天确实。 哦,有点懈怠所以说,呃,昨天啊,那个二叉树的构造那道题没做,所以说可能这道题啊就没有那么顺畅的给做出来。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* tra(vector<int>& nums,int left,int right){if(left>=right) return nullptr;int partion=left;for (int i = left + 1; i < right; ++i) {if (nums[i] > nums[partion]) partion = i;}TreeNode* root = new TreeNode(nums[partion]);root->left = tra(nums, left, partion);root->right = tra(nums, partion+1, right);return root;}TreeNode* constructMaximumBinaryTree(vector<int>& nums) {return tra(nums, 0, nums.size());}
};
617. 合并二叉树 - 力扣(LeetCode)
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
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. 二叉搜索树中的搜索
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if(root==nullptr||root->val==val) return root;TreeNode* result = NULL;if(root->val > val){result=searchBST(root->left,val);}else{result=searchBST(root->right,val);}return result;}
};
98. 验证二叉搜索树 - 力扣(LeetCode)
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
private:vector<int> vec;void traversal(TreeNode* root) {if (root == NULL) return;traversal(root->left);vec.push_back(root->val); // 将二叉搜索树转换为有序数组traversal(root->right);}
public:bool isValidBST(TreeNode* root) {traversal(root);for (int i = 1; i < vec.size(); i++) {// 注意要小于等于,搜索树里不能有相同元素if (vec[i] <= vec[i - 1]) return false;}return true;}
};