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

思路

  • 方法1

    • 二叉搜索树,BST,左子树小于根,右子树大于根,如此递归定义。

    • BST的中序遍历,即按递增排序的序列。

    • 如此,通过先序遍历和中序遍历,即可唯一确定一棵树。

  • 方法2

    • 先序遍历,先根,BST,左子树小于根,右子树大于根。
    • 递归构造
  • 方法3

    • 在方法2的基础上,我们直接用区间递归构造即可。

代码

  • 方法1

    /*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
    class Solution {
    private:unordered_map<int,int> cnt;
    public:TreeNode* bstFromPreorder(vector<int>& preorder) {vector<int>inorder(preorder);sort(inorder.begin(),inorder.end());for(int i=0;i<inorder.size();i++){cnt[inorder[i]]=i;}return build(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);}TreeNode* build(vector<int>& preorder, int preStart, int preEnd, vector<int>& inorder, int inStart, int inEnd){if(preStart>preEnd){return nullptr;}int rootval = preorder[preStart];int index = cnt[rootval];int leftsize = index - inStart;TreeNode* root = new TreeNode(rootval);root->left = build(preorder, preStart+1, preStart+leftsize,inorder, inStart, index-1);root->right = build(preorder, preStart+leftsize+1, preEnd,inorder, index+1, inEnd);return root;}
    };
    
  • 方法2

    /*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
    class Solution {
    public:TreeNode* bstFromPreorder(vector<int>& preorder) {return build(preorder, 0, preorder.size()-1);}TreeNode* build(vector<int>& preorder, int left, int right){if(left>right)return nullptr;int rootval = preorder[left];TreeNode* root = new TreeNode(rootval);int l = left, r = right;//如果 l=left+1,对于只有两个数的区间,就会出问题while(l<r){int mid = (l+r)/2+1;//保证不会一直 mid=l,陷入死循环if(preorder[mid] < rootval){// 中间值小于根,往右边l = mid;}else{// 中间值大于根,往左边r = mid-1;//保证不会一直 mid=r,陷入死循环}}root->left = build(preorder, left+1, l);root->right = build(preorder, l+1, right);return root;}
    };
    
  • 方法3

    /*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
    class Solution {
    private:int idx=0;//保证函数内部的修改有效。
    public:TreeNode* bstFromPreorder(vector<int>& preorder) {return build(preorder, -1, 1e8+5);}TreeNode* build(vector<int>& preorder, int lower, int higher){if(idx==preorder.size()){return nullptr;}int val = preorder[idx];if(val<lower||val>higher)return nullptr;idx++;TreeNode* root = new TreeNode(val);root->left = build(preorder, lower, val);root->right = build(preorder, val, higher);return root;}
    };
    

构造二叉树-前序遍历相关推荐

  1. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  2. 树(二叉树层次遍历输出及二叉树前序遍历输入)

    前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况. 定义结构体 struct BiNode{char data;BiN ...

  3. C语言二叉树前序遍历(附完整源码)

    C语言二叉树前序遍历 C语言二叉树前序遍历完整源码(定义,实现,main函数测试) C语言二叉树前序遍历完整源码(定义,实现,main函数测试) #include <iostream>st ...

  4. 二叉树前序遍历执行过程

    二叉树前序遍历执行过程 前序遍历:根-左-右 图示 记录与总结,2021年 11月 12日 星期五 11:35:14 CST.

  5. 二叉树前序遍历(递归法和迭代法(即非递归法))——C++

    声明:本文原题主要来自力扣力扣,记录此博客主要是为自己学习总结,不做任何商业等活动 本文主要讲解二叉树的前序遍历递归法和迭代法.中序遍历和后序遍历可以参考博主下面两篇博客:二叉树中序遍历(递归法和迭代 ...

  6. C++实现的二叉树前序遍历函数

    #include <iostream> using namespace std;struct TreeNode {int val;TreeNode* left;TreeNode* righ ...

  7. 二叉树前序遍历-迭代

    二叉树的前序遍历 对于一颗二叉树,当遍历它的时候使用 递归总是轻而易举的. 这是二叉树前序遍历-使用递归 public void preorderTraversal(TreeNode root){if ...

  8. 用Java实现二叉树前序遍历、中序遍历和后序遍历。

    用Java实现二叉树前序遍历.中序遍历和后序遍历. 解析: public class Tree {private int data; /* 数据节点 */private Tree left; /* 左 ...

  9. 二叉树前序遍历与后序遍历

    二叉树 前序遍历 递归 借助栈进行排序 先将根节点压栈 栈不为空,如果存在根节点,先右后左. 弹栈打印.直至栈为空 package com.vitamin.tree;import java.util. ...

最新文章

  1. mongodb 设置远程可以访问
  2. 苹果iPhone被曝跟踪用户位置信息(图)
  3. WebService中使用自定义类的解决方法(5种)
  4. SpringCloud--Eureka服务注册与发现 Eureka 集群搭建 详细案例!!!
  5. ASP.NET MVC Caching with OutputCache
  6. 定时器驱动数码管c语言程序,74hc595驱动数码管时间程序
  7. 我为什么离开德国顶级传统大厂IT部
  8. python列表排序方法-python list排序的两种方法及实例讲解
  9. Python 之面向对象 继承
  10. RouteDebug.dll
  11. Spring的概述及主要模块
  12. linux锐捷代码_告诉你Ubuntu Linux锐捷安装方法及命令
  13. icmp协议用在什么服务器上,ICMP协议是什么?ICMP协议的作用是什么?
  14. 搜狐股票接口获取数据方法
  15. python英语单词 扇贝英语安卓下载_扇贝单词英语版app下载-扇贝单词英语版安卓版(附修改词汇书教程) - 超好玩...
  16. 九连环课程设计c语言,用C语言编程解九连环
  17. 耳机电声测试仪软件,CLIO 11电声测试仪
  18. java 将.amr音频文件转换为.mp3或.wav文件
  19. 文档大小超出上传限制怎么办_压缩PDF大小该怎么操作?压缩PDF的软件有哪些?...
  20. Accidently in love

热门文章

  1. vmtools官方下载地址
  2. Openid Connect(OIDC)
  3. 2.3、JavaScript 数据类型 - 数字类型
  4. 2008 NBA 全明星周未之扣篮大赛
  5. python 如何判断当天为周几?判断当天是否为工作日?
  6. accept 和 content-Type区别
  7. echarts markPoint 柱形图中添加图片
  8. MySQL 求平均数
  9. 【LeetCode】回溯 N皇后(DFS、子集、组合问题)
  10. jsoncpp在vs2012下的环境搭建(C++)