1.最大二叉树
题目链接/文章讲解:代码随想录
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* traversal(vector<int>& nums){
if(nums.size() == 0) return NULL;
// 中
int max = INT_MIN;
int index = 0;
for(int i = 0;i < nums.size() ;i++){
if(nums[i] > max){
max = nums[i];
index = i;
}
}
TreeNode* node = new TreeNode(max);
if(nums.size() == 1){
return node;
}
// 左
vector<int> left(nums.begin(),nums.begin() + index);
node->left = traversal(left);
// 右
vector<int> right(nums.begin() + index + 1,nums.end());
node->right = traversal(right);
return node;
}
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
return traversal(nums);
}
};
note:这里用到的切割数组用到的迭代器,都是左闭右开区间,因此右数组的开始范围是nums.begin() + index + 1。我这里写错了。
这种构建二叉树的题,都只能用前序遍历,因为左右孩子需要先有根结点,才能和根结点连接。
2.合并二叉树
题目链接/文章讲解:代码随想录
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == NULL && root2 == NULL){
return NULL;
}
if(root1 == NULL && root2 != NULL){
return root2;
}
if(root1 != NULL && root2 == NULL){
return root1;
}
// 中
root1->val = root1->val + root2->val;
// 左
root1->left = mergeTrees(root1->left,root2->left);
// 右
root1->right = mergeTrees(root1->right,root2->right);
return root1;
}
};
代码:层序遍历
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
queue<TreeNode*> que;
// 在root1的基础上进行修改
if(root1 == NULL) return root2;
if(root2 == NULL) return root1;
que.push(root1);
que.push(root2);
while(!que.empty()){
int size = que.size();
for(int i = 0; i < size; i += 2){
// 中
TreeNode* node1 = que.front();
que.pop();
TreeNode* node2 = que.front();
que.pop();
node1->val += node2->val;
// 左
if(node1->left && node2->left){
que.push(node1->left);
que.push(node2->left);
}
// 右
if(node1->right && node2->right){
que.push(node1->right);
que.push(node2->right);
}
// 当node1的左/右孩子为空时,需要将node2的子树赋值过去
if(!node1->left && node2->left){
node1->left = node2->left;
}
if(!node1->right && node2->right){
node1->right = node2->right;
}
}
}
return root1;
}
};
note:这道题我用层序遍历的时候,一直报错,找了好久才发现。。因为我一次操作两个结点,也就意味着我每次循环的循环量应该每次加2才对。。。(很容易陷入定势思维)
3.二叉树搜索树中的搜索
题目链接/文章讲解: 代码随想录
代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root == NULL){
return NULL;
}
if(root->val == val){
return root;
}
// 左
if(val < root->val){
return searchBST(root->left,val);
}
// 右
if(val > root->val){
return searchBST(root->right,val);
}
return root;
}
};
note:这个确实和数组的二分法很像。。。。
代码:迭代法
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
stack<TreeNode*> st;
if(root == NULL) return NULL;
st.push(root);
while(!st.empty()){
// 中
TreeNode* node = st.top();
st.pop();
if(node->val == val){
return node;
}
// 左
if(val < node->val && node->left){
st.push(node->left);
}
if(val > node->val && node->right){
st.push(node->right);
}
}
return NULL;
}
};
note:忘记弹出元素,导致超时了。。
这题用前序遍历才好用到搜索树的特性。
4.验证二叉搜索树
题目链接/文章讲解:代码随想录
代码:双指针 递归
class Solution {
public:
TreeNode* pre = NULL;
bool isValidBST(TreeNode* root) {
if(root == NULL){
return true;
}
// 左
bool left = isValidBST(root->left);
// 中
if(pre != NULL && pre->val >= root->val){
return false;
}
pre = root;
// 右
bool right = isValidBST(root->right);
return right && left;
}
};
note:这里是通过一个pre全局来记录root的上一个赋值,因为中序遍历二叉搜索树,一定是单调递增的,所以用这两个指针来判断。