LeetCode 代码随想录跟练 Day17
654.最大二叉树
题目描述:
在数组上构建二叉树,思路很直观,只需注意取到最大值后左右子树的边界,traverse使用left和right表示当前递归所使用到的数组的区间。代码如下:
class Solution {
private:
TreeNode* traverse(vector<int>& nums, int left, int right) {
if (left > right) return nullptr;
int maxVal = nums[left];
int maxIndex = left;
for (int i = left + 1; i <= right; ++i) {
if (nums[i] > maxVal) {
maxVal = nums[i];
maxIndex = i;
}
}
TreeNode* root = new TreeNode(maxVal);
root->left = traverse(nums, left, maxIndex - 1);
root->right = traverse(nums, maxIndex + 1, right);
return root;
}
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traverse(nums, 0, nums.size() - 1);
}
};
617.合并二叉树
题目描述:
实际上还是对二叉树的遍历,每次遍历的参数为两个二叉树各自位置的当前节点。不同的是在初值判断的过程中,若其中一个节点为空则直接返回另一个节点作为合并后的节点,其他过程使用前序遍历即可。代码如下:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (root1 == nullptr) return root2;
if (root2 == nullptr) return root1;
TreeNode* root = new TreeNode(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) {
if (root->val == val) return root;
else if (root->val > val) root = root->left;
else if (root->val < val) root = root->right;
}
return nullptr;
}
};
按照递归方法同二叉树递归框架:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (root == nullptr) return nullptr;
if (root->val == val) {
return root;
} else if (root->val > val) {
return searchBST(root->left, val);
} else {
return searchBST(root->right, val);
}
}
};
98.验证二叉搜索树
题目描述:
判断一个树是否是二叉搜索树最简单的逻辑:其左右子树是否是二叉搜索树,当前节点值是否大于左节点小于右节点。但是直接这样做会陷入一个局部解,对每个局部子树都是二叉搜索树的判断无法得出树整体是一个二叉搜索树,如下图
比如这里的两个子树都是二叉搜索树,但整体上根节点的左子树中有
5
>
3
5>3
5>3,不满足二叉搜索树的条件,所以在递归的同时需传入边界,向左子树前进时需传入根节点的值作为最大值的限制,向右子树前进时需传入根节点的值作为最小值的限制。代码如下:
class Solution {
private:
bool traverse(TreeNode* root, long long min, long long max) {
if (root == nullptr) return true;
if (root->val <= min || root->val >= max) return false;
return traverse(root->left, min, root->val) &&
traverse(root->right, root->val, max);
}
public:
bool isValidBST(TreeNode* root) {
return traverse(root, LONG_MIN, LONG_MAX);
}
};
注意在判断时使用大于等于和小于等于(二叉搜索树中不能有相同元素)