当前位置: 首页 > news >正文

LeetCode:1008. 前序遍历构造二叉搜索树

目录

题目描述:

代码:

第一种:

第二种:

第三种:分治法


题目描述:

给定一个整数数组,它表示BST(即 二叉搜索树 )的 序遍历 ,构造树并返回其根。

保证 对于给定的测试用例,总是有可能找到具有给定需求的二叉搜索树。

二叉搜索树 是一棵二叉树,其中每个节点, Node.left 的任何后代的值 严格小于 Node.val , Node.right 的任何后代的值 严格大于 Node.val

二叉树的 前序遍历 首先显示节点的值,然后遍历Node.left,最后遍历Node.right

示例 1:

输入:preorder = [8,5,1,7,10,12]
输出:[8,5,10,1,7,null,12]

示例 2:

输入: preorder = [1,3]
输出: [1,null,3]

代码:

第一种:

从左到右依次建立二叉搜索树

public TreeNode bstFromPreorder1(int[] preorder) {TreeNode root=new TreeNode(preorder[0]);for(int i=1;i<preorder.length;i++){int val=preorder[i];insert1(root,val);}return root;}public TreeNode insert1(TreeNode root,int val){if(root==null){return new TreeNode(val);}if(val<root.val){root.left=insert1(root.left,val);}else{root.right=insert1(root.right,val);}return root;}

第二种:

上限法

public TreeNode bstFromPreorder2(int[] preorder) {return insert(preorder,Integer.MAX_VALUE);}int i=0;public TreeNode insert(int[] preorde,int max){//递归结束的条件if(preorde.length==0){return null;}int val=preorde[i];//如果超出上限,返回nullif(val>max){return null;}//创建节点TreeNode root=new TreeNode(val);i++;//没超过上限,设置其子孩子,设置完返回//preorder,5(自身值)root.left=insert(preorde,val);//preorder,8(上一个节点值)root.right=insert(preorde,max);return root;}

第三种:

//解法3:分治法
//8,5,1,7,10,12
/*
* 根:8
* 左:5,1,7
* 右:10,12
*
* 根:5
* 左:1
* 右:7
*
* 根:10
* 左:null
* 右:12
* */
 public TreeNode bstFromPreorder(int[] preorder) {return partition(preorder,0,preorder.length-1);}private TreeNode partition(int[] preorder,int start,int end){if(start>end){return null;}TreeNode root=new  TreeNode(preorder[start]);int index=start+1;while(index<=end){if(preorder[index]>preorder[start]){break;}index++;}//index 是右子树的起点root.left=partition(preorder,start+1,index-1);root.right=partition(preorder,index,end);return root;}

http://www.lryc.cn/news/488992.html

相关文章:

  • gdb - 调试工具 - 入门 (一)
  • Swift内存访问冲突
  • 深入理解Spring(三)
  • TB6612电机驱动模块使用指南
  • Paper -- 洪水深度估计 -- 利用图像处理和深度神经网络绘制街道照片中的洪水深度图
  • 学习C#中的BackgroundWorker 组件
  • 【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
  • PCB 间接雷击模拟
  • JAVA泛型和顺序表ArrayList
  • Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
  • Javascript高级—深入JS模板字符串的高级用法
  • 14. 【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--章节总结
  • vulhub之fastjson
  • 2024年亚太地区数学建模大赛D题-探索量子加速人工智能的前沿领域
  • 卷积神经网络各层介绍
  • Python应用指南:高德拥堵延时指数
  • ISO 21434标准:汽车网络安全管理的利与弊
  • 无插件H5播放器EasyPlayer.js视频流媒体播放器如何开启electron硬解码Hevc(H265)
  • excel版数独游戏(已完成)
  • 接口上传视频和oss直传视频到阿里云组件
  • Arcgis 地图制作
  • 【每日一题1121】python校招笔试题、面试题
  • Spring Boot + Vue 基于 RSA 的用户身份认证加密机制实现
  • Docker搭建有UI的私有镜像仓库
  • Qt打开文件对话框选择文件之后弹出两次
  • 【JAVA】正则表达式中的正向肯定预查
  • django从入门到实战(一)——路由的编写规则与使用
  • vue框架开发的前端项目,build和package的区别
  • 视频智能分析软件LiteAIServer摄像机实时接入分析平台噪声监测算法介绍
  • 鸿蒙UI开发与部分布局