【代码随想录算法训练营——Day17】二叉树——654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
LeetCode题目链接
https://leetcode.cn/problems/maximum-binary-tree/
https://leetcode.cn/problems/merge-two-binary-trees/
https://leetcode.cn/problems/search-in-a-binary-search-tree/
https://leetcode.cn/problems/validate-binary-search-tree/
题解
654.最大二叉树
想仿照用昨天的题解里我没写过的递归数组的方式写,但不知道左右子树怎么分。
写对了,好开心啊。
617.合并二叉树
应该有个巧妙的方法能解题。
又写对了,不知道下一题能不能写出来。
700.二叉搜索树中的搜索
对递归越来越熟练了,但还是有拿捏不好的地方,对自己的算法和代码没有十足的把握。
98.验证二叉搜索树
根据中序遍历的提示,用递归怎么写不知道。怎么统计树的全部左结点和全部右结点,来判断值是否是满足根结点。看了题解,有一个思路,用中序遍历得到数组,再判断数组是否是有序的。第二是注意一个陷阱,后台测试数据会有int的最小值。题解中的代码在中序遍历的过程中保存最大值,当最大值大于当前遍历到的根结点的值时,就证明序列不是有序。必须要用中序遍历,递归时先遍历左子树,才能更新maxValue值,才能比较后面的中间结点。
代码
//654.最大二叉树
#include <iostream>
#include <vector>
#include <queue>
using namespace std;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) {return build(nums, 0, nums.size() - 1);}TreeNode* build(vector<int>& nums, int left, int right) {if (left > right) return NULL;int maxIndex = 0, maxValue = INT_MIN;for (int i = left;i <= right;i++) {if (nums[i] > maxValue) {maxValue = nums[i];maxIndex = i;}}TreeNode* root = new TreeNode(nums[maxIndex]);root->left = build(nums, left, maxIndex - 1);root->right = build(nums, maxIndex + 1, right);return root;}
};void levelOrder(TreeNode* root) {queue<TreeNode*> que;que.push(root);while (!que.empty()) {int size = que.size();for (int i = 0;i < size;i++) {TreeNode* tmp = que.front();que.pop();printf("%d ", tmp->val);if (tmp->left) que.push(tmp->left);if (tmp->right) que.push(tmp->right);}}
}int main() {vector<int> nums1 = { 3,2,1,6,0,5 }, nums2 = { 3,2,1 };Solution s;TreeNode* root = s.constructMaximumBinaryTree(nums2);levelOrder(root);return 0;
}
//617.合并二叉树
#include <iostream>
#include <queue>
using namespace std;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) {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 == NULL && root2) {root = root2;root->left = mergeTrees(NULL, root2->left);root->right = mergeTrees(NULL, root2->right);}else if (root1 && root2 == NULL) {root = root1;root->left = mergeTrees(root1->left, NULL);root->right = mergeTrees(root1->right, NULL);}else {root = NULL;}return root;}
};void levelOrder(TreeNode* root) {queue<TreeNode*> que;que.push(root);while (!que.empty()) {int size = que.size();for (int i = 0;i < size;i++) {TreeNode* tmp = que.front();que.pop();printf("%d ", tmp->val);if (tmp->left) que.push(tmp->left);if (tmp->right) que.push(tmp->right);}}
}int main() {int nums11[30] = { 1,3,2,5 }, nums12[30] = { 2,1,3,NULL,4,NULL,7 };int nums21[30] = { 1 }, nums22[30] = { 1,2 };TreeNode* root11 = new TreeNode(1);root11->left = new TreeNode(3);root11->right = new TreeNode(2);root11->left->left = new TreeNode(5);TreeNode* root12 = new TreeNode(2);root12->left = new TreeNode(1);root12->right = new TreeNode(3);root12->left->right = new TreeNode(4);root12->right->right = new TreeNode(7);TreeNode* root21 = new TreeNode(1);TreeNode* root22 = new TreeNode(1);root22->left = new TreeNode(2);Solution s;TreeNode *root = s.mergeTrees(root21, root22);levelOrder(root);return 0;
}
//98.验证二叉搜索树
class Solution {
public:long long maxValue = LONG_MIN;bool isValidBST(TreeNode* root) {if(root == NULL) return true;bool left = isValidBST(root->left);if(maxValue >= root->val) return false;else maxValue = root->val;bool right = isValidBST(root->right);return left && right;}
};