654.最大二叉树
题目链接:654. 最大二叉树 - 力扣(LeetCode)
题解:
本题依旧使用递归法,依旧是递归三部曲
1.确定递归函数的参数和返回值
TreeNode* constructMaximunBinaryTree(vector<int>& nums)
2.确定终止条件
因为题目输入数组大小是大于等于1,所以如果当传入的数组大小为1,说明就已经遍历到了叶子节点
TreeNode* node = new TreeNode(0);
if(nums.size() == 1) {
node->val = nums[0];
return node;
};
3.确定单层递归逻辑
以下有三步工作
1.先要找到数组最大值和对应的下标,最大的值构造根节点,下标用来下一步分割数组。
int maxvaue = 0;
int maxValueIndex = 0;
for (int i = 0; i < nums.size(); i++) {
if(nums[i] > maxValue) {
maxValue = nums[i];
maxValueIndex = i;
}
}
TreeNode* node = new TreeNode(0);
node->val = maxValue;
2.最大值所在的下标左区间 构造左子树
if (maxValueIndex > 0) {
vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);
}
3.最大值所在的下标右区间 构造右子树
if (maxValueIndex < (nums.size() - 1)) {
vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
node->right = constructMaximumBinaryTree(newVec);
}
总结C++代码:
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* node = new TreeNode(0);
if (nums.size() == 1) {
node->val = nums[0];
return node;
}
// 找到数组中最大的值和对应的下标
int maxValue = 0;
int maxValueIndex = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] > maxValue) {
maxValue = nums[i];
maxValueIndex = i;
}
}
node->val = maxValue;
// 最大值所在的下标左区间 构造左子树
if (maxValueIndex > 0) {
vector<int> newVec(nums.begin(), nums.begin() + maxValueIndex);
node->left = constructMaximumBinaryTree(newVec);
}
// 最大值所在的下标右区间 构造右子树
if (maxValueIndex < (nums.size() - 1)) {
vector<int> newVec(nums.begin() + maxValueIndex + 1, nums.end());
node->right = constructMaximumBinaryTree(newVec);
}
return node;
}
};
617.合并二叉树
题目链接:617. 合并二叉树 - 力扣(LeetCode)
题解:
本题依旧使用递归法
C++代码如下:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
// 修改了t1的数值和结构
t1->val += t2->val; // 中
t1->left = mergeTrees(t1->left, t2->left); // 左
t1->right = mergeTrees(t1->right, t2->right); // 右
return t1;
}
};