代码随想录Day20-Day23 补打卡

代码随想录Day20-Day23 补打卡

654.最大二叉树

  1. 构造树一般采用的是前序遍历,因为先构造中间节点,然后递归构造左子树和右子树;
  2. 要判断maxValueIndex > 0,因为要保证左区间至少有一个数值;
  3. 判断maxValueIndex < (nums.size() - 1),确保右区间至少有一个数值;

617.合并二叉树

  1. 因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了(如果t2也为NULL也无所谓,合并之后就是NULL);
  2. 只能按照上面的形式返回,才能保障t1/t2后面的节点都被合并;

700.二叉搜索树中的搜索

  1. 如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL;

98.验证二叉搜索树

  1. 陷阱1:不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了;我们要比较的是 左子树所有节点小于中间节点,右子树所有节点大于中间节点。
  2. 陷阱2:样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。此时可以初始化比较元素为longlong的最小值。
  3. 中序遍历下,输出的二叉搜索树节点的数值是有序序列。有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

530.二叉搜索树的最小绝对差

  1. 二叉搜索树采用中序遍历,其实就是一个有序数组。在一个有序数组上求两个数最小差值。
  2. 在二叉搜素树中序遍历的过程中,我们就可以直接计算了。需要用一个pre节点记录一下cur节点的前一个节点。

501.二叉搜索树中的众数

  1. 如果不是二叉搜索树,最直观的方法一定是把这个树都遍历了,用map统计频率,把频率排个序,最后取前面高频的元素的集合。
  2. 是二叉搜索树,既然是搜索树,它中序遍历就是有序的。
  3. 弄一个指针指向前一个节点,这样每次cur(当前节点)才能和pre(前一个节点)作比较。而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。
  4. 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组)
  5. 频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。

236. 二叉树的最近公共祖先

  1. 首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。
  2. 在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。
  3. 后序遍历(左右中)就是天然的回溯过程,可以根据左右子树的返回值,来处理中节点的逻辑回溯遍历整棵二叉树,将结果返回给头结点。

35. 二叉搜索树的最近公共祖先

  1. 因为是有序树,所有 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。
  2. 只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。
  3. 在遍历二叉搜索树的时候就是寻找区间[p->val, q->val](注意这里是左闭又闭)。那么如果 cur->val 大于 p->val,同时 cur->val 大于q->val,那么就应该向左遍历(说明目标区间在左子树上)。需要注意的是此时不知道p和q谁大,所以两个都要判断。

701.二叉搜索树中的插入操作

  1. 只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以。

450.删除二叉搜索树中的节点

  1. 这里就把二叉搜索树中删除节点遇到的情况都搞清楚。
    有以下五种情况:
    第一种情况:没找到删除的节点,遍历到空节点直接返回了
    找到删除的节点
    第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
    第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
    第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
    第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

669. 修剪二叉搜索树

  1. 如果root(当前节点)的元素小于low的数值,那么应该递归右子树,并返回右子树符合条件的头结点。
  2. 如果root(当前节点)的元素大于high的,那么应该递归左子树,并返回左子树符合条件的头结点。
  3. 接下来要将下一层处理完左子树的结果赋给root->left,处理完右子树的结果赋给root->right。最后返回root节点。

108.将有序数组转换为二叉搜索树

  1. 本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间。
  2. 分割点就是数组中间位置的节点。

538.把二叉搜索树转换为累加树

  1. 从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。
  2. 需要一个pre指针记录当前遍历节点cur的前一个节点,这样才方便做累加。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值