代码随想录算法训练营第二十天|654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

发布时间 2024-01-01 18:33:43作者: amulet

一、654.最大二叉树

题目链接:

LeetCode 654.最大二叉树

学习:

思路:

前序遍历

  • 方法参数:(int[] nums, int start, int end)

  • 返回类型:TreeNode

  • 终止条件:

    if(end-start==0) return null;
    if(end-start==1) return new TreeNode(nums[start]);
    
  • 单层递归逻辑:

    1. 寻找数组中的最大值,确定根结点,下标为index
    2. 对nums数组进行切割,找到左子树的范围和右子树的范围,左闭右开
    3. 递归调用分别返回左孩子和右孩子

二、617.合并二叉树

题目链接:

LeetCode 617.合并二叉树

学习前:

思路:

  • 递归:

    • 方法参数:(TreeNode root1, TreeNode root2)
    • 返回类型:TreeNode
    • 终止条件:3种结点为空的情况
    • 单层递归逻辑:
      1. 此时root1和root2均为非空,故根结点的值相加作为新的根结点
      2. 递归调用分别返回左孩子和右孩子
  • 迭代(栈):

    1. 首先为空判断
    if(root1==null) return root2;
    if(root2==null) return root1;
    if(root1==null) return root2;
    else if(root1!=null && root2==null) return root1; 
    
    1. 此时root1和root2均为非空,入栈值相加,当左右孩子均不为空时,依次入栈
    2. 返回root1

学习后:

优化了判空条件

if(root1==null) return root2;
if(root2==null) return root1;

三、700.二叉搜索树中的搜索

题目链接:

LeetCode 700.二叉搜索树中的搜索

学习前:

思路:

  • 递归:

    • 方法参数:(TreeNode root, int val)

    • 返回类型:TreeNode

    • 终止条件:if(rootnull || root.valval)return root;

    • 单层递归逻辑:

      val大于当前结点值,返回右子树;val小于当前结点值,返回左子树;val等于当前结点值,返回该结点

  • 迭代(栈):

    1. 首先为空判断if(root!=null) stack.push(root);

    2. 栈不为空的循环,pop当前节点,若val大于当前结点值却右孩子不为空,右孩子入栈;若val小于当前结点值且左孩子不为空,左孩子入栈;val等于当前结点值,返回该结点

    3. 返回null

学习后:

二叉搜索树的特性使得迭代法可以不用额外辅助空间,直接用root进行移动

四、98.验证二叉搜索树

题目链接:

LeetCode 98.验证二叉搜索树

学习后:

思路: 中序遍历

  • 递归:

    • 方法参数:(TreeNode root)

    • 返回类型:boolean

    • 终止条件:if(rootnull || root.valval)return root;

    • 单层递归逻辑:

      1. 左:递归调用

      2. 中:需要一个pre记录前序结点,并且与左子树进行比较

        if(pre!=null && root.val<=pre.val) return false;
        pre=root;
        
      3. 右:递归调用

  • 迭代(栈):

    1. 需要一个pre记录前序结点。在中序遍历迭代方式中,对中的操作修改为

      if(pre!=null && pre.val>=cur.val){
          return false;
      }
      pre=cur;
      

五、学习总结

  1. 时间:3h
  2. 二叉搜索树的验证需要采用中序遍历,且要保证左子树的所有结点值小于中结点,且右子树的所有结点值大于根结点