代码随想录训练营第33期第20天(补卡)|654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

654.最大二叉树

最大元素就是根节点

构造二叉树类的题目一定要用前序去构造(将中间节点构造出来 再去构造左子树和右子树)

1、确定递归函数的参数和返回值

返回二叉树的根节点

参数是存放元素的数组

返回类型是指向节点的指针

2、确定递归的终止条件

如果数组的大小为1,说明到叶子节点了,此时叶子节点就是根节点

3、单层递归逻辑

定义一个MaxValue以及对应的下标index

遍历数组,寻找比MaxValue数值还要大的值,作为二叉树的根节点

定义index的目的是,接下来分割数组的时候,要根据下标来进行分割

构造根节点,要用MaxValue来构造

加下来就是构造左子树和右子树

构造左子树的时候,保证左边至少有一个元素,因为递归函数一开始的终止条件就是有一个元素

那么怎么保证,左区间至少存在一个元素呢?if(index>0);

分割数组用的是左闭右开

右区间:[index+1,nums.size())

671.合并二叉树

前中后遍历顺序都可以,前序遍历是最容易理解的

合并必须从两个树的根节点开始

1、确定递归函数的参数及返回值

参数是合并前的两个二叉树的根节点,返回值是合并后的二叉树的根节点

2、处理终止条件

如果二叉树1的节点为空,应该返回而二叉树2对应的节点

如果二叉树2的节点为空,应该返回而二叉树1对应的节点

3、确定单层递归的逻辑

重复利用了tree1

根节点 对应相加

新的tree1的左子树=tree1左子树和tree2左子树相加

右子树与左子树处理结果一样

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//1
    //2、确定终止条件
    if(root1==NULL) return root2;
    if(root2==NULL ) return root1;
    root1->val+=root2->val;
    root1->left=mergeTrees(root1->left,root2->left);
    root1->right=mergeTrees(root1->right,root2->right);
    return root1;
    }
};

  700.二叉搜索树中的搜索             

首先回顾一下什么是二叉搜索树?

二叉搜索树是一个有序树

若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值

若它的右子树不空,则右子树上所有节点的值均小于它的根节点的值

它的左、右子树也分别为二叉搜索树

在二叉树中,谈到搜索,需要考虑一下用什么方法遍历,但是在,二叉搜索树中不用考虑该情况,因为二叉搜索树本身就自带顺序

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {//1、确定递归函数的参数及返回值
    //2、确定终止条件
    if(root==NULL||root->val==val) return root;
    TreeNode * result=NULL;
    if(root->val>val) result=searchBST(root->left,val);
    if(root->val<val) result=searchBST(root->right,val);
    return result;


    }
};

98.验证二叉搜索树

不管是判断该二叉树是不是二叉搜索树 还是遇到二叉搜索树的时候 一定要想到 中序遍历

定义一个指针 初始化该指针指向空节点 主要是用来记录前一个节点 将正在遍历的节点与前一个节点比较 若前一个节点大于当前节点 返回 false 并将pre=root 

本文以上学习内容来自代码随想录

代码随想录 (programmercarl.com)

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值