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

力扣二叉树--第三十三天

前言

前面都是遍历,今天是构造二叉树。

前序和中序可以唯一确定一棵二叉树。

后序和中序可以唯一确定一棵二叉树。

前序和后序不能唯一确定一棵二叉树!

内容

一、从中序与后序遍历序列构造二叉树

106. 从中序与后序遍历序列构造二叉树

给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。

递归

用哈希表存储中序序列

后序遍历的末尾元素为当前子树的根节点,找出它在中序遍历中的位置,以此来分割

func buildTree(inorder []int, postorder []int) *TreeNode {
    hashMap:=map[int]int{}
    for i,v:=range inorder{
        hashMap[v]=i
    }
    var build func(int,int)*TreeNode
    build=func(inorderLeft,inordeRight int)*TreeNode{
        if inorderLeft>inordeRight{
            return nil
        }
        val:=postorder[len(postorder)-1]
        postorder=postorder[:len(postorder)-1]
        root:=&TreeNode{Val:val}
          // 由于我们每次都从后序遍历的末尾取元素,所以要先遍历右子树再遍历左子树
      inorderRoot:=hashMap[val]
      root.Right=build(inorderRoot+1,inordeRight)
      root.Left=build(inorderLeft,inorderRoot-1)
      return root
    }
    return build(0,len(inorder)-1)
}
二、从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

递归

此时,前序遍历的首元素为当前子树的根节点,找出它在中序遍历中的位置,以此来分割

别忘了要更新前序遍历,将用过的首元素去掉

func buildTree(preorder []int, inorder []int) *TreeNode {
    hashMap:=map[int]int{}
    for i,v:=range inorder{
        hashMap[v]=i
    }
    var build func(int,int)*TreeNode
    build=func(inorderLeft,inorderRight int)*TreeNode{
         if inorderLeft>inorderRight{
             return nil
         }
        
           val:=preorder[0]
        root:=&TreeNode{Val:val}
        preorder=preorder[1:]//少了这一步
        inorderRoot:=hashMap[val]
        root.Left=build(inorderLeft,inorderRoot-1)
        root.Right=build(inorderRoot+1,inorderRight)
        return root
    }
  return build(0,len(inorder)-1)
}
func buildTree(preorder []int,inorder []int)*TreeNode{
    if len(preorder)==0{
        return nil
    }
    root:=&TreeNode{preorder[0],nil,nil}
    i:=0
    for ;i<len(inorder);i++{
        if inorder[i]==preorder[0]{
            break
        }
    }
    root.Left=buildTree(preorder[1:len(inorder[:i])+1],inorder[:i])
    root.Right=buildTree(preorder[len(inorder[:i])+1:],inorder[i+1:])
    return root
}

最后

构造二叉树基础,got it!


http://www.kler.cn/a/147141.html

相关文章:

  • Spring Boot教程之Spring Boot简介
  • nuget 管理全局包、缓存和临时文件夹
  • 7.揭秘C语言输入输出内幕:printf与scanf的深度剖析
  • pytest | 框架的简单使用
  • C语言剖析:srand()/rand()/time()
  • 以太坊基础知识结构详解
  • nginx反向代理解决跨域前端实践
  • docker 安装jekins
  • 西南科技大学信号与系统A实验一(信号的产生与时域运算)
  • 微软Azure AI新增Phi、Jais等,40种新大模型
  • 对Laxcus分布式操作系统的认知、价值、痛点解决的回答
  • 第三节HarmonyOS DevEco Studio了解基本工程目录
  • JSP 循环ajax 返回的集合
  • 香港科技大学广州|智能制造学域博士招生宣讲会—天津大学专场
  • Apache换行解析漏洞(CVE-2017-15715)
  • 红米手机如何远程控制荣耀手机?
  • 在OpenCV中基于深度学习的边缘检测
  • nuxt、vue实现PDF和视频文件的上传、下载、预览
  • go语言基础 break和contine区别
  • Mac 搭建本地服务器
  • 云原生系列Go语言篇-泛型Part 1
  • 2-Python与设计模式--前言
  • MIT6.824-Raft笔记:Raft初探、副本间log时序
  • Electronica慕尼黑电子展 Samtec团队与21ic分享虎家产品与方案
  • AI - Steering behaviors(转向系统)
  • 阶段二:进阶知识(掌握Python的常用设计模式)