十七天打卡,今天的题比较简单,有昨天做题的基础,654题比较容易,中序遍历下,输出的二叉搜索树节点的数值是有序序列。
654.最大二叉树
递归法
class Solution {
public:
TreeNode* build(vector<int>& nums, int begin, int end) {
if (begin == end) return nullptr;
int index = begin;
for (int i = begin; i < end; i++) {
if (nums[i] > nums[index]) index = i;
}
TreeNode* node = new TreeNode(nums[index]);
if (end - begin == 1) return node;
node->left = build(nums, begin, index);
node->right = build(nums, index + 1, end);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return build(nums, 0, nums.size());
}
};
617.合并二叉树
做题过程
- 用递归法做出来,重新构造了一棵树,也可以在原树上改值
递归法
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (!root1) return root2;
if (!root2) return root1;
int val = root1->val + root2->val;
TreeNode* node = new TreeNode(val);
node->left = mergeTrees(root1->left, root2->left);
node->right = mergeTrees(root1->right, root2->right);
return node;
}
};
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 root = root->right;
}
return nullptr;
}
};
98.验证二叉搜索树
做题过程
- 一开始做的时候,我的思路是检测节点的左右子节点值是否小于或大于节点的值,但是这样不满足二叉搜索树,因为二叉搜索树的右节点的所有值都要小于当前节点的值。后来修改思路:二叉搜索树跟中序遍历的关系很密切!
知识点
- 中序遍历下,输出的二叉搜索树节点的数值是有序序列。
中序遍历
class Solution {
public:
void traversal(TreeNode* node, vector<int>& buildVec) {
if (node == nullptr) return;
traversal(node->left, buildVec);
buildVec.push_back(node->val);
traversal(node->right, buildVec);
}
bool isValidBST(TreeNode* root) {
vector<int>buildVec;
traversal(root, buildVec);
for (int i = 1; i < buildVec.size(); i++) {
if (buildVec[i] <= buildVec[i - 1]) return false;
}
return true;
}
};