代码随想录【Day 19】 | 654.最大二叉树 、617.合并二叉树、700.二叉搜索树中的搜索 、98.验证二叉搜索树
654.最大二叉树
题目链接:654.最大二叉树
卡尔文解
视频讲解
解题思路及注意事项:
构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树。
代码实现:
/**
* 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 maxVal = 0;
int maxIdx;
for( int idx = 0; idx < nums.size(); idx++ ){
if( nums[ idx ] > maxVal ){
maxVal = nums[ idx ];
maxIdx = idx;
}
}
node->val = maxVal;
// 最大值所在的下标左区间( 左闭右开 ) 构造左子树
if( maxIdx > 0 ){
vector<int> newVec( nums.begin(), nums.begin() + maxIdx );
node->left = constructMaximumBinaryTree( newVec );
}
// 最大值所在的下标右区间( 左闭右开 ) 构造右子树
if( maxIdx < ( nums.size() - 1 )){
vector<int> newVec( nums.begin() + maxIdx + 1, nums.end() );
node->right = constructMaximumBinaryTree( newVec );
}
return node;
}
};
617.合并二叉树
题目链接:617.合并二叉树
卡尔文解
视频讲解
解题思路及注意事项:
代码实现:
/**
* 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* root1, TreeNode* root2) {
if( !root1 ) return root2; // 如果root1为空,合并之后就应该是root2
if( !root2 ) return root1; // 如果root2为空,合并之后就应该是root1
root1->val += root2->val;
root1->left = mergeTrees( root1->left, root2->left );
root1->right = mergeTrees( root1->right, root2->right );
return root1;
}
};
700.二叉搜索树中的搜索
题目链接:700.二叉搜索树中的搜索
卡尔文解
视频讲解
解题思路及注意事项:
代码实现:
/**
* 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) {
while( root ){
if( val < root->val ) root = root->left;
else if( val > root->val ) root = root->right;
else return root;
}
return NULL;
}
};
98.验证二叉搜索树
题目链接:98.验证二叉搜索树
卡尔文解
视频讲解
###################################
解题思路及注意事项:
代码实现:
/**
* 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 = NULL; // 用来记录前一个节点
public:
bool isValidBST(TreeNode* root) {
if (root == NULL) return true;
bool left = isValidBST(root->left);
if (pre != NULL && pre->val >= root->val) return false;
pre = root; // 记录前一个节点
bool right = isValidBST(root->right);
return left && right;
}
};