654.最大二叉树
题解
TreeNode* construct(vector<int>& nums, int left, int right) {
if (left >= right) return nullptr;
int maxIndex = left;
for (int i = left + 1; i < right; i++) {
if (nums[i] > nums[maxIndex]) maxIndex = i;
}
TreeNode* root = new TreeNode(nums[maxIndex]);
root->left = construct(nums, left, maxIndex);
root->right = construct(nums, maxIndex + 1, right);
return root;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if (nums.size() == 0) return nullptr;
else return construct(nums, 0, nums.size());
}
总结
与从中序数组后序数组建立二叉树相比算简单一点了,先找到nums中最大元素的下标,划分出左右两个区间,然后new一个根结点填入最大元素的值,递归调用构造函数,用左区间构建根节点的左子树,用右区间构造根节点的右子树。
617.合并二叉树
题解
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (root1 == nullptr) return root2;
if (root2 == nullptr) return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left, root2->left);
root1->right = mergeTrees(root1->right, root2->right);
return root1;
}
总结
同时操作两颗二叉树,将root1与root2相加,然后root1与root2的左右子树互相相加即可。
700.二叉搜索树中的搜索
题解
TreeNode* searchBST(TreeNode* root, int val) {
if (root == nullptr) return nullptr;
if (root->val == val) return root;
if (root->val > val) return searchBST(root->left, val);
if (root->val < val) return searchBST(root->right, val);
return nullptr;
}
总结
按二叉树的定义递归搜索即可。
98.验证二叉搜索树
题解
void traversal_BST(TreeNode* root, vector<int>&BSTresult) {
if (root == nullptr) return;
traversal_BST(root->left, BSTresult);
BSTresult.push_back(root->val);
traversal_BST(root->right, BSTresult);
}
bool isValidBST(TreeNode* root) {
vector<int> BSTresult;
traversal_BST(root, BSTresult);
for (int i = 1; i < BSTresult.size(); i++) {
if (BSTresult[i] <= BSTresult[i - 1]) return false;
}
return true;
}
总结
验证是否满足二叉树的定义,只需要查看其中序遍历结果是否递增即可。