654.最大二叉树
题目链接:654. 最大二叉树 - 力扣(LeetCode)
解题思路:使用递归来解决。
1、终止条件:当数组里面只有一个值的时候,这个值就是叶子节点,return这个节点即可。
2、递归函数的返回值和参数:因为这题需要构建一个二叉树,所以递归函数的返回值应该是节点,而传递进去的参数则是数组。
3、单层递归逻辑:首先找到这个数组中的最大值的索引,然后将这个最大值赋给根节点,然后以这个最大值的索引进行切割,左边的数组是左子树,右边的数组是有子树,然后将这两个数组分别传入递归函数,继续寻找。
代码实现:
class Solution {
public:
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
TreeNode* node = new TreeNode(0);
if(nums.size() == 1){
node->val = nums[0];
return node;
}
int max_value = 0;
int max_index = 0;
for(int i = 0;i < nums.size();i++){
if(nums[i]>max_value){
max_index = i;
max_value = nums[i];
}
}
node->val = max_value;
if(max_index > 0){
vector<int>vec(nums.begin(),nums.begin() + max_index);
node->left = constructMaximumBinaryTree(vec);
}
if(max_index<nums.size() - 1){
vector<int>vec(nums.begin() + max_index + 1,nums.end());
node->right = constructMaximumBinaryTree(vec);
}
return node;
}
};
617.合并二叉树
题目链接:617. 合并二叉树 - 力扣(LeetCode)
解题思路:同时操作两个二叉树,进行同步遍历。
1、终止条件:当其中一个树的节点为空的时候,则返回另外一个树的节点。
2、函数返回类型和传入的参数:返回的应该是树的节点,传入的参数则是两棵树的根节点。
3、单层递归逻辑:创建一个新的节点,节点的值是两棵树节点值的总和,然后分别对左右子树进行递归。
代码实现:
class Solution {
public:
TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
if(root1 == NULL) return root2;
if(root2 == NULL ) return root1;
TreeNode* node = new TreeNode(0);
node->val = root1->val + root2->val;
node->left = mergeTrees(root1->left,root2->left);
node->right = mergeTrees(root1->right,root2->right);
return node;
}
};
700.二叉搜索树中的搜索
题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)
解题思路:这题使用递归来解决,不过这题由于二叉搜索树的自身特性不用考虑遍历的顺序,因为二叉搜索树能够明确的给出搜索方向。
1、终止条件:当传入的根节点为空,或者传入节点的值等于目标值则返回。
2、函数返回值类型和传入参数:返回值类型应该是节点,而传入的参数是节点和需要搜索的目标值。
3、单层递归逻辑:判断目前搜索到的节点的值与目标值的关系,若大于目标值则向左孩子搜索,如小于目标值则向右孩子搜索直到找到或则遍历完整个二叉树。
代码实现:
class Solution {
public:
TreeNode* searchBST(TreeNode* root, int val) {
if(root == NULL ||root->val == val) return root;
TreeNode *result = NULL;
if(root->val < val) result = searchBST(root->right,val);
if(root->val > val) result = searchBST(root->left,val);
return result;
}
};
98.验证二叉搜索树
题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)
解题思路:同样是使用递归的方式来解决,但是需要注意二叉搜索树的特性是左子树所有的值小于根节点,右子树所有的值大于根节点,即如果将二叉搜索树按中序遍历展开的话应该是一个有序数组,所以很容易踩坑,可能出现右子树的左子树中的某个值小于这个二叉树的根节点的情况。
1、终止条件:遍历到的节点为空,空节点也是二叉搜索树,返回true;
2、函数返回类型和参数:返回类型应该是bool型,若一个其中一个子树返回false则这棵树就不算二叉搜索树。
3、单层逻辑:每遍历一个节点则进行一次判断,判断其是否大于前一个节点,若大于则继续,若小于则返回false。
代码实现:
class Solution {
public:
long long maxval = LONG_MIN;
bool isValidBST(TreeNode* root) {
if(root == NULL) return true;
bool left = isValidBST(root->left);
if(maxval < root->val){
maxval = root->val;
}
else return false;
bool right = isValidBST(root->right);
if (left && right){
return true;
}else return false;
}
};