654. 最大二叉树
题目链接:654. 最大二叉树
此题类似构建二叉树,也是对数组进行切割。主要思路就是找到数组中最大值作为根节点,左边数组为左子树,右边数组为右子树。
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if (nums.size() == 0) return nullptr;
TreeNode* root = new TreeNode(0);
if (nums.size() == 1) {
root->val = nums[0];
return root;
}
int maxvalue = 0, index = 0;
for (int i = 0; i < nums.size(); i++) {
if (maxvalue < nums[i]) {
maxvalue = nums[i];
index = i;
}
}
root->val = maxvalue;
vector<int> leftNums(nums.begin(), nums.begin() + index);
vector<int> rightNums(nums.begin() + index + 1, nums.end());
root->left = constructMaximumBinaryTree(leftNums);
root->right = constructMaximumBinaryTree(rightNums);
return root;
}
};
617. 合并二叉树
题目链接:617. 合并二叉树
- 左子树为空,返回右子树,即使右子树为空,返回的是null
- 右子树为空,返回左子树,即使左子树为空,返回的是null
- 借用左子树构造二叉树,不用新建立节点了
class Solution {
public:
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;
}
};
700. 二叉搜索树中的搜索
题目链接:700. 二叉搜索树中的搜索
注意二叉搜索树的性质,左子树的所有值比跟节点小,右子树的所有值比节点大。
利用这个性质,可以使得题目非常简单。
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while (root != nullptr) {
if(root->val > val) root = root->left;
else if(root->val < val) root = root->right;
else return root;
}
return nullptr;
}
};
迭代法
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
while (root != nullptr) {
if(root->val > val) root = root->left;
else if(root->val < val) root = root->right;
else return root;
}
return nullptr;
}
};
98. 验证二叉搜索树
题目链接:98. 验证二叉搜索树
注意二叉搜索树的性质,用root->val > root->left->val && root->val < root->right->val
判断是不对的,例如如下情况
此二叉树满足上述条件判断,但是6比10小,不满足二叉搜索树的条件。
采用中序遍历,使用一个指针不断记录前一个节点值(左节点),和根节点比较。
其他方法也可以定义一个最大值不断保存上一个节点的值,如果此值大于根节点的值,则返回false,但是输入案例中存在int 的最小值,所以应该定义为long long型,但是如果存在long long最小值,就不好操作了。
class Solution {
public:
TreeNode* pre = nullptr;
bool isValidBST(TreeNode* root) {
if(root == nullptr) return true;
bool left = isValidBST(root->left); //左
if(pre != nullptr && pre->val >= root->val) return false; //中
pre = root;
bool right = isValidBST(root->right); //右
return left && right;
}
};