首页 > 其他分享 >代码随想录:● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

代码随想录:● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

时间:2023-09-10 19:32:19浏览次数:46  
标签:TreeNode val 二叉 搜索 二叉树 return root 节点 left

 654.最大二叉树 

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

示例 :

代码随想录:● 654.最大二叉树  ● 617.合并二叉树  ● 700.二叉搜索树中的搜索  ● 98.验证二叉搜索树 _二叉搜索树

提示:

给定的数组的大小在 [1, 1000] 之间。

解析:

题目所示,先找出最大值为根,然后根据最大值左边构建左子树,最大值右边构建右子树,天然的前序遍历构建二叉树。

递归三部曲->(左闭右开区间)

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

2、确定终止条件:传入的数组大小为1,说明遍历到了叶子节点,这时候应该定义一个新的节点,并把数组的数值复制给新的节点。

3、确定单层递归逻辑:

           3.1-找到数组中最大的值和对应的下标,最大值构建根节点,下标用来下一步分隔数组。

           3.2-最大值所在下标的左区间构造左子树

           3.3-最大值所在下标的右区间构造右子树

class Solution {
    public TreeNode constructMaximumBinaryTree(int[] nums) {
        return function(nums,0,nums.length);
    }

    public TreeNode function(int[] nums, int left, int right){
        if(right - left < 1){
            return null;
        }
        if(right - left == 1){
            return new TreeNode(nums[left]); 
        }
        int maxIndex = left;
        int maxValue = nums[maxIndex];
        for(int i = left+1; i < right; i++){
            if(nums[i] > maxValue){
                maxValue = nums[i];
                maxIndex = i;
            }
        }
        TreeNode root = new TreeNode(maxValue);
        //左闭右开
        root.left = function(nums,left,maxIndex);
        //左闭右开
        root.right = function(nums,maxIndex+1,right);
        return root;
    }
}

617.合并二叉树

力扣题目链接(opens new window)

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

代码随想录:● 654.最大二叉树  ● 617.合并二叉树  ● 700.二叉搜索树中的搜索  ● 98.验证二叉搜索树 _二叉搜索树_02

注意: 合并必须从两个树的根节点开始。

解析:

比较简单,分几种情况讨论,然后前序遍历相加即可。

class Solution {
    public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
        //递归
        if(root1 == null && root2 == null){
            return null;
        }
        if(root1 != null && root2 == null){
            return root1;
        }
        if(root1 == null && root2 != null){
            return root2;
        }
        TreeNode root = new TreeNode(root1.val + root2.val);
        root.left = mergeTrees(root1.left, root2.left);
        root.right = mergeTrees(root1.right,root2.right);
        return root;
    }
}

700.二叉搜索树中的搜索

力扣题目地址(opens new window)

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

代码随想录:● 654.最大二叉树  ● 617.合并二叉树  ● 700.二叉搜索树中的搜索  ● 98.验证二叉搜索树 _二叉树_03

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL

解析:

递归法比较简单,也是可以用前序遍历的方法,但要注意,不能直接的调用searchBST函数,因为这个函数是有返回值的,需要有个变量来承接该函数。

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root == null || root.val == val) return root;
        TreeNode left = searchBST(root.left,val);
        if(left != null) return left;
        return searchBST(root.right,val);
    }
}

注意到这是二叉搜索树,所以可以有优化方案:

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root == null || root.val == val) return root;
        if(root.val > val) return searchBST(root.left,val);
        else return searchBST(root.right,val);
    }
}

98.验证二叉搜索树

力扣题目链接(opens new window)

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

代码随想录:● 654.最大二叉树  ● 617.合并二叉树  ● 700.二叉搜索树中的搜索  ● 98.验证二叉搜索树 _二叉树_04

解析: 

1、递归法,因为是BST,所以要注意中序遍历的话一定是有序的,这题我是直接看的题解,所以没有踩那几个陷阱。但我拿到题目的第一反应,也是打算淡出的比较左节点小于中间节点,右节点大于中间节点就完事了。这是错误的,只有左子树的全部节点小于根节点,右子树的全部节点大于根节点才算有效BST。这时候就需要一个max作为中间节点,只要左子树中的max节点是小于根节点即可满足要求。

单层递归逻辑:中序遍历max,只要max >= root.val, 就返回false

class Solution {
    TreeNode max;
    public boolean isValidBST(TreeNode root) {
        if(root == null) return true;
        boolean left = isValidBST(root.left);
        if(!left) return false;
        if(max != null && max.val >= root.val)
            return false;
        max = root;
        boolean right = isValidBST(root.right);
        return right;
    }
}

2、利用二叉搜索树特性,中序遍历是有序的,可以把值都保存到一个数组中,然后判断这个数组是否有序

class Solution {
    List<Integer> list = new ArrayList<>();
    public boolean isValidBST(TreeNode root) {
        search(root);
        for(int i = 1; i < list.size(); i++){
            if(list.get(i) <= list.get(i-1)){
                return false;
            }
        }
        return true;
    }

    public void search(TreeNode root){
        if(root == null) return;
        //左
        search(root.left);
        //中
        list.add(root.val);
        //右
        search(root.right);
    }
}

3、迭代法:这个比较生疏,照着题解看一眼回顾回顾

class Solution {
    public boolean isValidBST(TreeNode root) {
        if(root == null){
            return true;
        }
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;
        while(root != null || !stack.isEmpty()){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            TreeNode pop = stack.pop();
            if(pre != null && pop.val <= pre.val)
                return false;
            pre = pop;
            root = pop.right;
        }
        return true;
    }
}

标签:TreeNode,val,二叉,搜索,二叉树,return,root,节点,left
From: https://blog.51cto.com/u_15505301/7427754

相关文章

  • Boost搜索引擎
    项目背景先说一下什么是搜索引擎,很简单,就是我们平常使用的百度,我们把自己想要所有的内容输入进去,百度给我们返回相关的内容.百度一般给我们返回哪些内容呢?这里很简单,我们先来看一下.搜索引擎基本原理这里我们简单的说一下我们的搜索引擎的基本原理.我们给服务器发起请求......
  • 【学习笔记】折半搜索 Meet In The Middle
    点击查看目录目录算法实现杂题乱写[CEOI2015Day2]世界冰球锦标赛题单oi-wiki算法实现我们正常的搜索应该是一个指数级的:\(2^n\)。然而我们可以把这个搜索拆成两半,设小于整张图的限制\(limit\)为合法:对于上半搜索,我们有若干符合限制的答案\(sum_1\),对于下半搜索,我......
  • 构建高性能全文搜索引擎:Java与Elasticsearch
    在今天的应用程序中,全文搜索功能变得越来越重要。无论是在线商店、博客网站还是企业应用,用户都希望快速而准确地找到他们需要的信息。Elasticsearch是一个强大的全文搜索引擎,可以轻松应对这一需求。本文将向你展示如何使用Java与Elasticsearch构建高性能的全文搜索引擎。什么是Elas......
  • 【学习笔记】折半搜索 Meet In The Middle
    点击查看目录目录算法实现杂题乱写[CEOI2015Day2]世界冰球锦标赛题单oi-wiki算法实现我们正常的搜索应该是一个指数级的:\(2^n\)。然而我们可以把这个搜索拆成两半,设小于整张图的限制\(limit\)为合法:对于上半搜索,我们有若干符合限制的答案\(sum_1\),对于下半搜索,我......
  • 搜索合集
    深度优先搜索(DFS)引入:迷宫问题有一个\(n\timesm\)的迷宫,你一开始在\((1,1)\),每次可以向上下左右走一步,要走到\((n,n)\)且路径不能重复,不能经过障碍,问有多少种方法?用以下迷宫为例:(红色是起点,绿色是终点)我们每次可以向上下左右走一步。这样,我们每次选择一个方向,沿着这个......
  • Java版剑指offer:平衡二叉树
    Java版剑指offer:平衡二叉树描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树平衡二叉树(BalancedBinaryTree),具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉......
  • java版本剑指offer:在二叉树中找到两个节点的最近公共祖先
    java版本剑指offer:在二叉树中找到两个节点的最近公共祖先描述给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值o1和o2,请找到o1和o2的最近公共祖先节点。注:本题保证二叉树中每个节点的val值均不相同。示例1输入:[3,5,1,6,2,0,8,#,#,7,4],5,1返回值:3方法一:递......
  • leet code 35.搜索插入位置
    简单题蕴含大学问linkleetcode35.搜索插入位置思路历程学习算法已有时日,再做这一道简单程度的二分题目时-发现还是不能游刃有余地掌握。题目中要求:需要在数组中找到目标值,并返回其索引,如果目标值不存在于数组中的话,返回其将会被顺序插入的位置。那么有两种情况目标值在数组中......
  • 二叉树遍历
    #include<stdio.h>#include<stdlib.h>//定义typedefstructBiTNode{intdata;//数据域structBiTNode*lchild,*rchild;}BiTNode,*BiTree;//创建新节点boolcreateNode(BiTree&T,intvalue){T=(BiTNode*)malloc(sizeof(BiTNode));......
  • [刷题记录Day 23]Leetcode二叉树
    No.1题目修剪二叉搜索树思路递归法有点抽象,要对具体案例做模拟才好懂递归分析返回值:节点,参数:节点,[下界,上界]终止条件:遇到空节点,返回空单层递归逻辑:判断不在范围内的情况:当前节点小于下界/大于上界,直接返回右/左子树递归结果;若在范围内,则递归筛查左右子树,返回当前节点......