本文主要是介绍代码随想录算法训练营第十九天|654 最大二叉树、617 合并二叉树、700 二叉搜索树中的搜索、98 验证二叉搜索树,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
654 最大二叉树
题目链接:最大二叉树
思路
这道题目是让我们构造最大二叉树并返回根节点。谈及二叉树,首先要确定遍历方式,这道题目一个符合思维的遍历方式是前序遍历(中左右),先有中间节点,然后递归构造左节点和右节点。
class Solution {
public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {TreeNode* node = new TreeNode(0);if(nums.size() == 1){node->val = nums[0];return node;}// 找到数组中最大的值和对应的下标int maxValue = 0;int maxValueIndex = 0;for(int i=0; i<nums.size(); i++){if(nums[i] >= maxValue){maxValue = nums[i];maxValueIndex = i;}}node->val = maxValue;if(maxValueIndex>0){vector<int> newVec(nums.begin(),nums.begin()+maxValueIndex);node->left = constructMaximumBinaryTree(newVec);}if(maxValueIndex < (nums.size() - 1)){vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());node->right = constructMaximumBinaryTree(newVec);}return node;}
};
617 合并二叉树
题目链接:合并二叉树
思路
这道题目简洁明了,就是给你两个树,都有的节点则相加,一个有一个没有则替换。首先确定遍历顺序,前序遍历符合思考逻辑。
class Solution {
public:TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if(root1 == nullptr) return root2;if(root2 == nullptr) return root1;TreeNode* root = new TreeNode(0);root->val = root1->val + root2->val;root->left = mergeTrees(root1->left, root2->left);root->right = mergeTrees(root1->right, root2->right);return root;}
};
700 二叉搜索树中的搜索
题目链接:二叉搜索树中的搜索
思路
二叉搜索树本身就是一种有规则的树,采用迭代法可以很简单地写出在其中搜索目标值。
class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {while(root != nullptr){if(val < root->val){root = root->left;}else if(val > root->val){root = root->right;}else{return root;}}return nullptr;}
};
当然用递归法也可以解决此问题,采用前序遍历的方法。
class Solution {
public:TreeNode* searchBST(TreeNode* root, int val) {if(root == nullptr || root->val == val){return root;}TreeNode* res;if(val < root->val){res = searchBST(root->left, val);}if(val > root->val){res = searchBST(root->right, val);}return res;
}
};
98 验证二叉搜索树
题目链接:验证二叉搜索树
思路
先确定遍历顺序,使用中序遍历的话输出就是一个有序的数组。再判断输出的数组是否是有序的即可。
class Solution {
public:vector<int> vec;void traversal(TreeNode* root){if(root == nullptr) return;traversal(root->left);vec.push_back(root->val);traversal(root->right);}bool isValidBST(TreeNode* root) {vec.clear();traversal(root);for(int i=1; i<vec.size();i++){if(vec[i] <= vec[i-1]){return false;}}return true;}
};
参考链接
- https://programmercarl.com/0098.%E9%AA%8C%E8%AF%81%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91.html#%E6%80%9D%E8%B7%AF
这篇关于代码随想录算法训练营第十九天|654 最大二叉树、617 合并二叉树、700 二叉搜索树中的搜索、98 验证二叉搜索树的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!