第一题:
原题链接:. - 力扣(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* constructMaximumBinaryTree(vector<int>& nums) {if(nums.size() == 0) return nullptr;int index = 0;for(int i = 0; i < nums.size(); i++){if(nums[i] > nums[index]){index = i;}}TreeNode* root = new TreeNode(nums[index]);vector<int> leftnums(nums.begin(), nums.begin() + index);vector<int> rightnums(nums.begin() + index + 1, nums.end());root -> left = constructMaximumBinaryTree(leftnums);root -> right = constructMaximumBinaryTree(rightnums);return root;}
};
第二题:
原题链接:617. 合并二叉树 - 力扣(LeetCode)
思路:
终止条件:因为传入了两个树,那么就有两个树遍历的节点t1和t2,如果t1==null,那么两个树合并之后就是t2,同理t2==null,合并之后就是t1。
单层递归逻辑
将两个树的当前节点进行相加。然后赋值给新创建的根节点。然后根节点的左指向和右指向就进行递归。
代码如下:
/*** 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* t1, TreeNode* t2) {if (t1 == NULL) return t2;if (t2 == NULL) return t1;// 重新定义新的节点,不修改原有两个树的结构TreeNode* root = new TreeNode(0);root->val = t1->val + t2->val;root->left = mergeTrees(t1->left, t2->left);root->right = mergeTrees(t1->right, t2->right);return root;}
};
第三题:
原题链接:700. 二叉搜索树中的搜索 - 力扣(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* searchBST(TreeNode* root, int val) {if(root == nullptr) return nullptr;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 nullptr;}
};
第四题:
原题链接:98. 验证二叉搜索树 - 力扣(LeetCode)
思路:
终止条件:如果root为空的话则返回true;
先用一个pre来记录当前遍历节点的前一个节点,判断当前节点的值是否大于pre的值。
使用中序遍历,左中右这样遍历。
先向左遍历:找到第一个节点,然后用bool left接住返回值。
中:当前的pre不为空的情况下进行判断。然后将pre赋值为pre。
最后向右遍历 然后用bool right接住返回值。
最后返回left && right。
代码如下:
/*** 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:TreeNode* pre = nullptr;
public: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;}
};