654.最大二叉树
使用递归回溯的方法,并且可以借用之前利用前序中序数组写二叉树的方法,直接对数组nums的序号进行操作,可以减少重构数组的内存
class Solution {
private:
TreeNode* traversal(vector<int>& nums, int left, int right){
if (left >= right) return nullptr;
int Maxindex = left;
for (int i = left; i < right; i++){
if (nums[i] > nums[Maxindex]){
Maxindex = i;
}
}
TreeNode* node = new TreeNode(nums[Maxindex]);
node->left = traversal(nums,left,Maxindex);
node->right = traversal(nums,Maxindex+1,right);
return node;
}
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums,0,nums.size());
}
};
617.合并二叉树
直接对root1进行操作
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (!root1) return root2;
if (!root2) return root1;
root1->val += root2->val;
root1->left = mergeTrees(root1->left,root2->left);
root1->right = mergeTrees(root1->right,root2->right);
return root1;
}
};
700.二叉搜索树中的搜索
首先要明白,二叉搜索树和二叉树的区别
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。
此题注意先判断节点是否为NULL,再判断val的关系。后序则利用二叉搜索树的规律来找关系
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (!root ||root->val == val) return root;
TreeNode* ans =NULL;
if (val > root->val) ans = searchBST(root->right,val);
if (val < root->val) ans = searchBST(root->left,val);
return ans;
}
};
98.验证二叉搜索树
最简单的方法,先将二叉树中序遍历,然后判断是否为从小到大排列
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val); // 将二叉搜索树转换为有序数组
traversal(root->right);
}
public:
bool isValidBST(TreeNode* root) {
vec.clear(); // 不加这句在leetcode上也可以过,但最好加上
traversal(root);
for (int i = 1; i < vec.size(); i++) {
// 注意要小于等于,搜索树里不能有相同元素
if (vec[i] <= vec[i - 1]) return false;
}
return true;
}
};