前言
今天还是二叉树递归,相比于前两天可以写出部分代码了,有的题甚至有思路可以自己实现。
Leetcode 654 最大二叉树
题目链接:654. 最大二叉树 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:这道题目类似于一直中后序创造二叉树,终止条件是当前数组只有一个数了,证明左右节点都为空。需要先找到数组中的最大值,然后划分左边和右边,然后传入左数组和右数组递归。
代码:
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* root=new TreeNode(0);
if(nums.size()==1)//终止条件,传入数组大小为1
{
root->val=nums[0];
return root;
}
int index=0;
int max=-1;
for(int i=0;i<nums.size();i++)//找到当前数组最大值
{
if(nums[i]>max)
{
index=i;
max=nums[i];
}
}
root->val=max;//创造节点
if(index>0)//起码得有一个元素
{
vector<int> lnum(nums.begin(),nums.begin()+index);//划分左右数组
root->left=constructMaximumBinaryTree(lnum);
}
if(index<nums.size()-1)//起码得有一个元素
{
vector<int> rnum(nums.begin()+index+1,nums.end());
root->right=constructMaximumBinaryTree(rnum);
}
return root;
}
};
Leetcode 617 合并二叉树
题目链接:617. 合并二叉树 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:终止条件为其中一个树的左节点为空或者右节点为空,都不为空则相加,然后传入左右孩子。
代码:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
TreeNode* root=new TreeNode(0);
if(root1==NULL)//终止条件
{
root=root2;
return root;
}
if(root2==NULL)
{
root=root1;
return root;
}
root->val=root1->val+root2->val;//相加
root->left=mergeTrees(root1->left, root2->left);
root->right=mergeTrees(root1->right, root2->right);
return root;
}
};
Leetcode 700 二叉搜索树中的搜索
题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:二叉搜索树是一种数据结构,根节点比左孩子大,比右孩子小,所以搜索的时候如果大于目标值就去左孩子,小于目标值就去右孩子。
代码:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root==NULL||root->val==val)
{
return root;
}
if(root->val>val)
{
return searchBST(root->left, val);
}
if(root->val<val)
{
return searchBST(root->right, val);
}
return NULL;
}
};
Leetcode 98 验证二叉搜索树
题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)
代码随想录题解:代码随想录 (programmercarl.com)
思路:中序遍历二叉搜索树的结果是有序的,所以我们需要比较当前所遍历的值是否比上一次大。
代码:
class Solution {
public:
long long maxVal = LONG_MIN;
bool isValidBST(TreeNode* root) {
if(root==NULL)
{
return true;
}
bool left=isValidBST(root->left);//左
if (maxVal < root->val) maxVal = root->val;//中
else return false;
bool right = isValidBST(root->right);//右
return left && right;
}
};
总结
这几天状态不是很好,学习效率比较低,及时调整