Leetcode 654. 最大二叉树
链接:654. 最大二叉树
thought:
- 本题只要想明白递归函数需要哪些参数后解题就十分简单
- 首先是每轮递归的l和r一定是要有的,其次原数组nums也要保留,我们创建的根指针也要进入,这里提示一下,通过引用的方式,你可以用new指针为辅函数的指针参数动态分配内存空间
- 先序遍历,每轮操作就是遍历当前 l 到 r ,找最大值,开辟空间确立子树,然后向下递归
完整C++代码如下:
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
if (nums.empty())
return NULL;
TreeNode* root = NULL;
traversal(0, nums.size() - 1, nums, root);
return root;
}
void traversal(int l, int r, vector<int>& nums, TreeNode*& root) {
if (l > r)
return;
int numNow = INT_MIN;
int num;
for (int i = l; i <= r; i++) {
if (numNow < nums[i]) {
numNow = nums[i];
num = i;
}
}
root = new TreeNode(numNow);
traversal(l, num - 1, nums, root->left);
traversal(num + 1, r, nums, root->right);
}
};
Leetcode 617. 合并二叉树
链接:617. 合并二叉树
thought:
本题我的第一想法是采用层序遍历,两个二叉树同时遍历,将第二个二叉树值加到第一个二叉树上,但我在思考当两个二叉树遍历到某个位置第二个二叉树有值,第一个二叉树为空时该怎样为第一个二叉树遍历处开辟空间犯了难,新位置部分每个节点都要开辟空间,求助gpt后发现直接把node1->left = node2->left;
即可,哈哈
完整C++代码如下:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if (!root1) return root2;
if (!root2) return root1;
queue<pair<TreeNode*, TreeNode*>> que;
que.push({root1, root2});
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
pair<TreeNode*, TreeNode*> temp = que.front();
TreeNode* node1 = temp.first;
TreeNode* node2 = temp.second;
node1->val += node2->val;
// Check and add left child nodes
if (node1->left && node2->left)
que.push({node1->left, node2->left});
else if (!node1->left && node2->left)
node1->left = node2->left;//无push
// Check and add right child nodes
if (node1->right && node2->right)
que.push({node1->right, node2->right});
else if (!node1->right && node2->right)
node1->right = node2->right;//无push
que.pop();
}
}
return root1;
}
};
PS:本题也可以直接建立两个栈
Leetcode 700. 二叉搜索树中的搜索
thought:
前序遍历快速解决
完整C++代码如下:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(!root)return NULL;
if(root->val==val)return root;
else if(root->val>val)return searchBST(root->left,val);
else return searchBST(root->right,val);
}
};
Leetcode 98. 验证二叉搜索树
链接:98. 验证二叉搜索树
thought:
二叉搜索树中,中序遍历为升序
完整C++代码如下:
class Solution {
public:
bool isValidBST(TreeNode* root) {
vector<int>vec;
traversal(root,vec);
for(int i=0;i<vec.size()-1;i++){
if(vec[i]>=vec[i+1])return false;
}
return true;
}
void traversal(TreeNode* root,vector<int>&vec){
if(!root)return;
if(root->left)traversal(root->left,vec);
vec.push_back(root->val);
if(root->right)traversal(root->right,vec);
}
};