654.最大二叉树
又是构造二叉树,昨天大家刚刚做完 中序后序确定二叉树,今天做这个 应该会容易一些, 先看视频,好好体会一下 为什么构造二叉树都是 前序遍历
题目链接/文章讲解:代码随想录
视频讲解:又是构造二叉树,又有很多坑!| LeetCode:654.最大二叉树_哔哩哔哩_bilibili
/*** 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) {TreeNode* node=new TreeNode(0);if (nums.size()==1){node->val=nums[0];return node;}int maxvalue=0;int maxvalueindex=0;if (nums.size()==1)return node;for (int i=0;i<nums.size();i++){if (maxvalue<nums[i]){maxvalue=nums[i];maxvalueindex=i;}}node->val=maxvalue;if (maxvalueindex>0){vector<int> leftnums{nums.begin(),nums.begin()+maxvalueindex};node->left=constructMaximumBinaryTree(leftnums);}if (maxvalueindex<nums.size()-1){vector<int>rightnums{nums.begin()+maxvalueindex+1,nums.end()};node->right=constructMaximumBinaryTree(rightnums);}return node;}
};
617.合并二叉树
这次是一起操作两个二叉树了, 估计大家也没一起操作过两个二叉树,也不知道该如何一起操作,可以看视频先理解一下。 优先掌握递归。
题目链接/文章讲解:代码随想录
视频讲解:一起操作两个二叉树?有点懵!| LeetCode:617.合并二叉树_哔哩哔哩_bilibili
/*** 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:void traversal(TreeNode* node1,TreeNode* node2){if (node1 && node2)node1->val+=node2->val;if (node1->left && node2->left)traversal(node1->left, node2->left);if (node1->right && node2->right)traversal(node1->right,node2->right);if (!node1->left)node1->left=node2->left;if (!node1->right)node1->right=node2->right;}TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if ((!root1 && !root2) || (root1 && !root2))return root1;if (!root1 && root2)return root2;traversal(root1,root2);return root1;}
};
总结
这里有对当前节点的判断,还有对下面左右节点的判断。
700.二叉搜索树中的搜索
递归和迭代 都可以掌握以下,因为本题比较简单, 了解一下 二叉搜索树的特性
题目链接/文章讲解: 代码随想录
视频讲解:不愧是搜索树,这次搜索有方向了!| LeetCode:700.二叉搜索树中的搜索_哔哩哔哩_bilibili
/*** 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* traversal(TreeNode* node,TreeNode*res,int val){if (!node || res)return res;if (node->val==val)res=node;if (node->val>val)res=traversal(node->left, res,val);if (node->val<val)res=traversal(node->right,res,val);return res;}TreeNode* searchBST(TreeNode* root, int val) {TreeNode* res=NULL;return traversal(root,res,val);}};
98.验证二叉搜索树
遇到 搜索树,一定想着中序遍历,这样才能利用上特性。
但本题是有陷阱的,可以自己先做一做,然后在看题解,看看自己是不是掉陷阱里了。这样理解的更深刻。
题目链接/文章讲解:代码随想录
视频讲解:你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树_哔哩哔哩_bilibili
/*** 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:void traversal(TreeNode* node,vector<int>&res){if (!node)return;traversal(node->left,res);res.push_back(node->val);traversal(node->right,res);}bool isValidBST(TreeNode* root) {if (!root)return true;vector<int>res;traversal(root,res);for (int i=1;i<res.size();i++)if (res[i]<=res[i-1])return false;return true;}
};
总结
亏我用回溯解了半天。