分享
  1. 首页
  2. 文章

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

tomorrowwu · · 2352 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

描述

根据一棵树的前序遍历与中序遍历构造二叉树

注意:

你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:

 3
 / \
 9 20
 / \
 15 7

思路

  • 前序遍历中,第一个节点即根节点
  • 在中序遍历中,找出第一个节点的位置,根节点前面的 L 个数据,即根节点左子树的中序遍历数据,前序遍历中根节点后面的 L 个数据即左子树的前序遍历
  • 右子树同上
  • 简而言之,确定了根节点,确定了左子树和右子树的数据,递归对左子树和右子树进行重建

代码实现

// 根据一棵树的前序遍历与中序遍历构造二叉树
// TreeNode Definition for a binary tree node.
type TreeNode struct {
 Val int
 Left *TreeNode
 Right *TreeNode
}
func buildTree(preorder []int, inorder []int) *TreeNode {
 if len(preorder) == 0 {
 return nil
 }
 //前序遍历的第一个节点即根节点
 res := &TreeNode{
 Val: preorder[0],
 }
 if len(preorder) == 1 {
 return res
 }
 // 在中序遍历中,根节点前面的即根节点的左子树,后面的即右子树
 //匿名函数
 idx := func(val int, nums []int) int {
 for i, v := range nums {
 if v == val {
 return i
 }
 }
 return -1
 }(res.Val, inorder)
 if idx == -1 {
 panic("data error")
 }
 //递归,构建根节点左子树和右子树
 res.Left = buildTree(preorder[1:idx+1], inorder[:idx])
 res.Right = buildTree(preorder[idx+1:], inorder[idx+1:])
 return res
}

题目来源

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

GitHub

本文为原创文章,转载注明出处,欢迎扫码关注公众号 楼兰 或者网站https://lovecoding.club,第一时间看后续精彩文章,觉得好的话,顺手分享到朋友圈吧,感谢支持。

image


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:tomorrowwu

查看原文:LeetCode105. 从前序与中序遍历序列构造二叉树

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2352 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏