😊654.最大二叉树
思路
类似之前前中序构造二叉树,以[)
为界限递归构建,不过这次的中是最大值,通过中就可以判断左右子树是什么样子。
代码
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums, 0, nums.size());
}
TreeNode* traversal(vector<int>& nums, int left, int right){
if (left >= right) return nullptr;
int maxval = nums[left];
int maxidx = left;
for (int i = left + 1; i < right; i ++){
if (nums[i] > maxval){
maxval = nums[i];
maxidx = i;
}
}
TreeNode* root = new TreeNode(maxval);
root->left = traversal(nums, left, maxidx);
root->right = traversal(nums, maxidx + 1, right);
return root;
}
};
617. 合并二叉树
思路
- 迭代:层序遍历,如果左左都在,就放进去,右右都在,就放进去,如果有一个不在就赋节点。
代码
- 递归
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (root1 == nullptr && root2 == nullptr) return nullptr;
if (!root1) return root2;
if (!root2) return root1;
TreeNode* root = new TreeNode(root1->val + root2->val);
root->left = mergeTrees(root1->left, root2->left);
root->right = mergeTrees(root1->right, root2->right);
return root;
}
};
- 迭代
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2;
if (t2 == NULL) return t1;
queue<TreeNode*> que;
que.push(t1);
que.push(t2);
while(!que.empty()) {
TreeNode* node1 = que.front(); que.pop();
TreeNode* node2 = que.front(); que.pop();
// 此时两个节点一定不为空,val相加
node1->val += node2->val;
// 如果两棵树左节点都不为空,加入队列
if (node1->left != NULL && node2->left != NULL) {
que.push(node1->left);
que.push(node2->left);
}
// 如果两棵树右节点都不为空,加入队列
if (node1->right != NULL && node2->right != NULL) {
que.push(node1->right);
que.push(node2->right);
}
// 当t1的左节点 为空 t2左节点不为空,就赋值过去
if (node1->left == NULL && node2->left != NULL) {
node1->left = node2->left;
}
// 当t1的右节点 为空 t2右节点不为空,就赋值过去
if (node1->right == NULL && node2->right != NULL) {
node1->right = node2->right;
}
}
return t1;
}
};
700.二叉搜索树中的搜索
思路
利用二叉搜索树特性写if-else
就可以
迭代法考虑,深度优先遍历为stack
,广度优先遍历为queue
代码
- 递归
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if (!root) return nullptr;
if (val < root->val) return searchBST(root->left, val);
if (val > root->val) return searchBST(root->right, val);
return root;
}
};
- 迭代
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. 验证二叉树
思路&问题
- 思路:需要验证
root
和root->left
还有root->right
之间的关系 - 问题:比较
root->left
需要溯源到root
的根节点,也就是要比较上上层的关系,那么需要一个值来记录。先一直递归到最左下角,然后比较root
和root->left
,记录,在看root->right
。不要先比较一个节点左右,再递归左右节点,这样没有记忆性。
代码
class Solution {
public:
long long res = LONG_MIN;
bool isValidBST(TreeNode* root) {
if (!root) return true;
bool left = isValidBST(root->left);
if (root->val > res) res = root->val;
else return false;
bool right = isValidBST(root->right);
return left && right;
}
};