代码随想录第17天 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

news2024/11/25 19:24:39

654.最大二叉树

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var constructMaximumBinaryTree = function (nums) {
  if (nums.length === 0) return null
  let m = Math.max(...nums);
  let x = nums.indexOf(m)
  const root = new TreeNode(m, constructMaximumBinaryTree(nums.slice(0, x)), constructMaximumBinaryTree(nums.slice(x + 1))); // 创建中间节点
  return root
};

第一想法

如代码

困难

  • slice的左右区间注意,[ , ),左闭右开

617.合并二叉树

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root1
 * @param {TreeNode} root2
 * @return {TreeNode}
 */
var mergeTrees = function(root1, root2) {
 if (root1 == null && root2) {  //1不行 2行,直接返回2,不进行后面的节点相加操作了
    return root2;
  }
  if ((root1 && root2 == null) || (root1 == null && root2 == null)) {  //1行2不行,返回1;或者都不行,返回1也就是null
    return root1;
  }
 //都行
  const root =new TreeNode(root1.val+root2.val, mergeTrees(root1.left,root2.left),mergeTrees(root1.right,root2.right)) // 创建中间节点
  return root  
};

第一想法

递归

 const root =new TreeNode(root1.val+root2.val, 
 mergeTrees(root1.left,root2.left),
 mergeTrees(root1.right,root2.right)) // 创建中间节点
  return root  

困难

  • 结束条件

if (root1 == null && root2) {
//1不行 2行,直接返回2,不进行后面的节点相加操作了
return root2;
}
if ((root1 && root2 == null) || (root1 == null && root2 == null)) {
//1行2不行,返回1;或者都不行,返回1也就是null
return root1;
}


700.二叉搜索树中的搜索

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @param {number} val
 * @return {TreeNode}
 */
var searchBST = function(root, val) { //自己的写法
    if(!root) return null;
    const st=[root] //栈,pop(),push()

    while(st.length){  //
        let x=st.pop();	//每次遍历输出,把右左孩子入栈
        if(x.val===val)
        return x
        x.right &&st.push(x.right) //很重要,不然下一次遍历x.val会出错
        x.left &&st.push(x.left)
    }
    return null
};

**********************************************
var searchBST = function(root, val) {
    while (root) {
        if (val === root.val) {
            return root;
        }
        root = val < root.val ? root.left : root.right;
    }
    return null;
};
//作者:迭代法力扣官方题解

***********************************************
var searchBST = function(root, val) {
    if (!root) {
        return null;
    }
    if (val === root.val) {
        return root;
    }
    return searchBST(val < root.val ? root.left : root.right, val);
};

//作者:回调法力扣官方题解


第一想法

前序遍历就行了,不管是迭代法还是回调法,但是忽略了题目中的搜索树的条件。


思想

在这里插入图片描述

因为是搜索树,所以只有一条路径

98.验证二叉搜索树

法一:

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
var isValidBST = function(root) {

     let arr = [];
    const buildArr = function(root) {
        if (root) {
            buildArr(root.left);
            arr.push(root.val);
            buildArr(root.right);
        }
    }
    buildArr(root);
    for (let i = 1; i < arr.length; ++i) {
        if (arr[i] <= arr[i - 1])
            return false;
    }
    return true;
};

第一想法

先序遍历,然后递归,写不出来,然后我又忽略了题意,即使按我的想法做出来,
也不符合题意:

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

思想

  • 有效二叉树的中序遍历出来是从小到大的,(迭代、回调)转换为数组,然后比较

法二:

let pre = null;
var isValidBST = function (root) {
    let pre = null;
    const inOrder = (root) => {
        if (root === null)
            return true;
        let left = inOrder(root.left); //左
// 中序遍历,验证遍历的元素是不是从小到大
        if (pre !== null && pre.val >= root.val)
            return false;
        pre = root;

        let right = inOrder(root.right);//右
        return left && right;
    }
    return inOrder(root);
};

思想

  • 确定递归函数,返回值以及参数
    let pre = null; 用来记录前一个节点

  • 确定终止条件
    如果是空节点 是不是二叉搜索树呢?
    是的,二叉搜索树也可以为空!
    代码如下:
    if (root == NULL) return true;

  • 确定单层递归的逻辑
    中序遍历,一直更新maxVal,一旦发现maxVal >= root->val,就返回false,注意元素相同时候也要返回false。

回调法的过程:使用一个节点(pre)来记录之前访问过的节点,判断依据是当前节点的val一定要大于pre.val。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/424186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2.docker-本地镜像发布

1.发布到阿里云 前往 容器镜像服务 (aliyun.com) 进入容器镜像服务 1.创建命名空间 2.创建镜像仓库 3.进入仓库管理页面获得脚本 # 需要输入密码,终端输出 Login Succeeded 则为登录成功 docker login --username用户名 registry.cn-hangzhou.aliyuncs.com# 标记 docker tag …

TCP 协议的相关特性

TCP 协议的相关特性&#x1f50e;TCP协议的特点&#x1f50e;TCP协议段格式&#x1f50e;TCP协议的相关特性确认应答(ACK)超时重传三次握手四次挥手三次挥手与四次握手的注意事项&#x1f50e;结尾TCP(Transmission Control Protocol) 传输控制协议 &#x1f50e;TCP协议的特点…

Hbase伪分布安装配置

Hbase安装配置 文章目录Hbase安装配置Hbase安装前提下载Hbase压缩包软件版本兼容性Hadoop和HbaseHbase和JDK软件安装软件位置创建数据保存和日志保存文件夹修改配置文件修改hbase-site.xml文件修改hbase-env.sh文件修改~/.bashrc文件启动hbase并验证权限问题Permission denied修…

外源6-BA在缓解多花黄精种子出苗过程中的代谢及转录组学变化

文章标题&#xff1a;Transcriptomics and metabolomics changes triggered by exogenous 6-benzylaminopurine in relieving epicotyl dormancy of Polygonatum cyrtonema Hua seeds 发表期刊&#xff1a;Frontiers in Plant Science 影响因子&#xff1a;6.627 作者单位&a…

电镀废水中的三价铬去除效率

电镀废水中铬的主要存在形式为六价铬&#xff08;绝大多数&#xff09;和三价铬&#xff0c;二者在一定条件下可互相转换&#xff0c;且二者都可能具有致癌左右&#xff0c;有所区别的是六价铬的毒性大约是三价铬毒性的100倍。 目前电镀废水中对铬的处理工艺一般为先将毒性较大…

KD2684S绕组匝间故障检测仪

一、产品简介 KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造成线圈层…

【高危】Apache Linkis <1.3.2 存在反序列化漏洞(CVE-2023-29216)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦&#xff0c;提供标准化接口的中间件。 该项目受影响版本存在存在反序列化漏洞&#xff0c;由于SqlConnection.java中未对host、port、username,、password等参数进行充分过滤&#xff0c;当恶意用户完全控制应…

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍&#xff0c;今天我们来聊一下&#xff0c;如何避免自己重复的写相同的代码&#xff0c;一次代码实现&#xff0c;即可完美复制到任何项目中实现权限相关的功能。 实现…

进阶方案:仅主机+NAT实现真机与虚拟机实现真正的互联互通

序 昨天写了NAT模式下使用端口转发实现真机可以访问到虚拟机的方案&#xff0c;但是我觉得应该还可以更简单&#xff0c;不需要使用端口转发&#xff0c;然后今天花了一上午的时间终于解决了这个问题&#xff0c;总结一下 仅主机模式 仅主机模式可以让真机跟虚拟机之间形成一…

【数据结构】算法的时间复杂度和空间复杂度 (上)(附leetcode练习题)

☃️个人主页&#xff1a;fighting小泽 &#x1f338;作者简介&#xff1a;目前正在学习C语言和数据结构 &#x1f33c;博客专栏&#xff1a;数据结构 &#x1f3f5;️欢迎关注&#xff1a;评论&#x1f44a;&#x1f3fb;点赞&#x1f44d;&#x1f3fb;留言&#x1f4aa;&…

智慧园区系统未来发展前景及应用趋势分析

完善的系统功能&#xff0c;强大的技术支持&#xff0c;使得智慧园区的应用趋势更加多元化&#xff0c;下面我们一起来了解一下智慧园区系统未来发展前景及应用趋势。 1、人工智能。人工智能技术是智慧园区未来发展的重要方向。人工智能可以帮助园区更好地解决实际问题&…

Docker笔记1 | Docker学习和简介

1 | Docker学习和简介1 学习来源2 官方学习资源3 Docker简介3.1 Docker是什么&#xff1f;3.2 Docker应用场景3.3 Docker架构3.3 Docker的优势3.3 与传统虚拟机的区别1 学习来源 本系列笔记学习主要参考书籍《Docker-从入门到实践》以及结合官网的教程&#xff0c;仅作为个人学…

电脑开机后进不了系统怎么办?

案例&#xff1a;我的电脑开机之后&#xff0c;进入不了系统怎么办&#xff1f; 【今天我打开电脑时&#xff0c;发现进入不了系统&#xff0c;以前从来没有出现过这种情况。有没有小伙伴有解决的办法&#xff1f;在线等&#xff0c;急&#xff01;】 电脑开机后无法进入系统…

node 服务发布后无法访问

node 服务发布后无法访问问题描述&#xff1a;在本地环境访问ip3060端口能正常访问&#xff0c;部署到服务器后访问接口一直超时 解决方法&#xff1a; 看端口是否对外暴露 操作步骤 设置防火墙 点击Windows defender 防火墙 点击高级设置 点击入站规则 新建规则 将3060端口…

《程序员面试金典(第6版)》面试题 10.10. 数字流的秩

题目描述 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。请实现数据结构和算法来支持这些操作&#xff0c;也就是说&#xff1a; 实现 track(int x) 方法&#xff0c;每读入一个数字都会调用该方法&#xff1b; 实现 g…

全球首个完全开源的指令跟随大模型;T5到GPT-4最全盘点

1. Dolly 2.0&#xff1a;世界上第一个完全开源的指令跟随LLM 两周前&#xff0c;Databricks发布了类ChatGPT的大型语言模型 (LLM)Dolly&#xff0c;其训练成本不到 30 美元。今天&#xff0c;他们发布了 Dolly 2.0&#xff0c;这是业内第一个开源的指令跟随LLM&#xff0c;并根…

飞项的5种应用方法,帮助你轻松学会项目管理

随着时代的更新变化&#xff0c;在现代企业中&#xff0c;项目管理已经成为一项非常重要的能力考核。 而对于刚开始入门项目管理的新手&#xff0c;很多都不知道从哪里入手&#xff0c;怎么入手。同执行者相比&#xff0c;管理者所思考的维度又大不相同&#xff0c;接下来我们就…

java实现定时器的方法

大家在工作中&#xff0c;常常会遇到一些突发的工作&#xff0c;需要在短时间内完成。这就要求我们能够快速的处理这些突发事件&#xff0c;但是如果直接调用方法来做&#xff0c;时间太长了&#xff0c;会导致程序变得臃肿。那么有没有什么好的办法呢&#xff1f;下面我们就来…

notepad++在windows下使用mingw编译C语言

mingw下载链接&#xff1a;https://winlibs.com/ 官网https://www.mingw-w64.org也能下载&#xff0c;不过官网下载的那个不会用&#xff0c;以后再试了。 strawberry里面也集成了gcc编译器&#xff0c;使用它也可以编译&#xff0c;只是试了一下。 解压后有1个多G&#xf…

python入门(五) vscode配置Anaconda 环境,代码自动提示

文章目录1.conda的下载地址:1.配置conda的环境变量安装conda配置path2.vcode配置python插件3.配置conda1) Select Interpreter2) 选择conda环境4.测试vscode配置Anaconda 环境&#xff0c;代码自动提示. 本人工作中&#xff0c;用到了ai相关技术&#xff0c;但是java出身&#…