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

654.最大二叉树

  • 题目链接:代码随想录

  • 解题思路:
    构建二叉树的题目都是前序遍历,因为只有先建立起根节点,才能谈建立其他节点
    这类递归题目就是将大问题分解成一个个小问题,进而求解

    和给出前序遍历数组和后序遍历数组题很相似

public TreeNode constructMaximumBinaryTree(int[] nums) {
    return traversal(nums);
}


public TreeNode traversal(int[] nums){


    //判断终止条件
    if(nums.length == 1){
        return new TreeNode(nums[0]);
    }

    //处理中节点
    int maxValue = 0;
    int index = 0;//找索引位置
    for (int i = 0; i < nums.length; i++) {
        if(nums[i] > maxValue){
            maxValue = nums[i];             //更新最大值
            index = i;
        }
    }

    TreeNode root = new TreeNode(nums[index]);

    //分割数组处理左右节点
    //传入分割好的数组,递归构建左右子树
    //保证能构建左子树
    if(index > 0){
        int[] leftNums = Arrays.copyOfRange(nums, 0, index);//[0,index)
        root.left = traversal(leftNums);
    }

    //确保能构建右子树
    if(index < nums.length - 1){
        int[] rightNums = Arrays.copyOfRange(nums, index + 1, nums.length);//[0,index)
        root.right = traversal(rightNums);
    }

    //返回构建好的二叉树
    return root;
}

617.合并二叉树

题目链接:代码随想录

  • 采用前序遍历遍历二叉树
    一般建立二叉树都要采取前序遍历

    • 解题思路:
      这里将root1子树处理,将处理后的结果root1返回
  • ①参数和返回值:参数为两棵树,返回值应该为处理后的节点值
    ②终止条件:如果root1 == null说明,root1左子树为空,返回root2(如果root2也为空,那就都为空)同理对于root2也是一样的思路

    ③中节点处理逻辑:左子树加上右子树的值

    ④然后分别合并左右子树出结果

public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {

    //终止条件
    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.二叉搜索树中的搜索

题目链接:代码随想录

  • 二叉搜索树的认识:
    二叉搜索树大于根节点的值都在右边,小于根节点的值都在左边,所以给出一个数组就可以画出一棵符合条件的二叉树

    对于二叉搜索树,不需要回溯的过程,因为节点的有序性就帮我们确定了搜索的方向,因此
    由于节点的有序性,**可以不使用辅助栈或者队列就可以写出迭代法。**直接进行遍历就可以写出来

  • 递归法解题思路:
    ①参数和返回值:参数为每层要处理的节点和要比对的值,返回值为当前找到的元素
    ②终止条件:当遍历到某一层,root为null 或者 root.val满足题目要求的时候,返回结果
    ③处理逻辑:先比较中节点,再比较左右节点

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.left, val);
    }
    if(root.val < val){
        result = searchBST(root.right, val);
    }

    return result;

}
public TreeNode searchBST(TreeNode root, int val) {

    while(root != null){
        if(root.val > val){
            root = root.left;
        }else if(root.val < val){
            root = root.right;
        }else{
            return root;
        }
    }

    //遍历到头了
    return root;

}

98.验证二叉搜索树

题目链接:代码随想录

  • 解题思路一(借助数组):
    ①将二叉搜索树中序遍历成数组,然后看看数组是否有序

    解题思路二(利用二叉搜索树的性质):

public boolean isValidBST(TreeNode root) {
    traversal(root);
    for (int i = 1; i < result.size(); i++) {  //i从1开始
        if(result.get(i) <= result.get(i - 1)){  //这里是<=
            return false;
        }
    }
    return true;
}
public void traversal(TreeNode root){
    if(root == null){
        return;
    }
    traversal(root.left);
    result.add(root.val);
    traversal(root.right);
}
class Solution5 {
    // 递归
    TreeNode max;
    public boolean isValidBST(TreeNode root) {
        if (root == null) {
            return true;
        }
        // 左
        boolean left = isValidBST(root.left);
        if (!left) {
            return false;
        }
        // 中
        if (max != null && root.val <= max.val) {
            return false;
        }
        max = root;
        // 右
        boolean right = isValidBST(root.right);
        return right;
    }
}

// 中
if (max != null && root.val <= max.val) {
return false;
}
max = root;
// 右
boolean right = isValidBST(root.right);
return right;
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值