4道题目
654. 最大二叉树
617. 合并二叉树
700. 二叉搜索树中的搜索
98. 验证二叉搜索树
解题理解
654
这道题跟昨天的重构树很像,我采用的还是原先那一套生成新vector的方法写的,题解的优化方案还没有完全理解,不过Python用切片应该很简洁。
//优化方案
class Solution {
private:
// 在左闭右开区间[left, right),构造二叉树
TreeNode* traversal(vector<int>& nums, int left, int right) {
if (left >= right) return nullptr;
// 分割点下标:maxValueIndex
int maxValueIndex = left;
for (int i = left + 1; i < right; ++i) {
if (nums[i] > nums[maxValueIndex]) maxValueIndex = i;
}
TreeNode* root = new TreeNode(nums[maxValueIndex]);
// 左闭右开:[left, maxValueIndex)
root->left = traversal(nums, left, maxValueIndex);
// 左闭右开:[maxValueIndex + 1, right)
root->right = traversal(nums, maxValueIndex + 1, right);
return root;
}
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
};
617
这道题比较简单,基本就是一个思路,只在一个树上原地操作就行,然后左右子树哪个有就留哪个,都有就相加留下来。
700
因为是二叉搜索树,所以左右子树的大小是跟根节点有关系的,所以这道题也很简单,递归和迭代都很容易写。
98
写的时候只想着根节点大于左子树小于右子树就行,后来碰到各种测试样例又加了很多判断条件,整个过程越写越乱。看了题解发现可以利用中序遍历的特性,即二叉搜索树的中序遍历的结果一定非递减序列,只需要从一开始就维护一个最大值,只要每次中序遍历时它都没有当前值大,那就一定是二叉搜索树。
class Solution {
public:
long long max = LONG_MIN;
bool isValidBST(TreeNode* root) {
if(!root) return true;
bool left = isValidBST(root->left);
if(max < root->val) max = root->val ;
else return false;
bool right = isValidBST(root->right);
return left && right;
}
};