[Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树

目录

  • 树的遍历方式
    • 深度优先遍历
    • 广度优先遍历
  • 使用中序后序恢复二叉树
    • 图解
  • 题目:从前序与中序遍历序列构造二叉树
    • 思路:递归+"每个节点都可以是根节点"
    • Go代码
  • 题目:从中序与后序遍历序列构造二叉树
    • Go代码

树的遍历方式

树的常见遍历方法:

深度优先遍历

先往深走 ,遇道叶子节点再往回走。
说明:下面的前中后序指的是相对于中间节点的位置。

  • 前序遍历:中左右
  • 中序遍历:左中右
  • 后序遍历:左右中
    [Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树_第1张图片

广度优先遍历

一层一层的去遍历,一层访问完再访问下一层。

使用中序后序恢复二叉树

  • 中序:3 4 8 6 7 5 2 1 10 9 11 15 13 14 12
  • 后序:8 7 6 5 4 3 2 10 15 14 13 12 11 9 1

图解

[Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树_第2张图片
[Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树_第3张图片
[Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树_第4张图片

题目:从前序与中序遍历序列构造二叉树

题目链接:LeetCode-105. 从前序与中序遍历序列构造二叉树
[Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树_第5张图片

思路:递归+“每个节点都可以是根节点”

Go代码

func buildTree(preorder []int, inorder []int) *TreeNode {
    if len(preorder) == 0 {
        return nil
    }
    root := &TreeNode{Val: preorder[0]}
    i:=0
    for ;i<len(inorder);i++ {
        if inorder[i] == root.Val {
            break
        }
    }
    // 中序中:左中右,根节点左边都是left节点,右边都是right节点
    // 前序中:中左右,根节点后left节点遍历完了之后紧跟着right节点,这里left节点、right个数可以从中序中获取
    root.Left = buildTree(preorder[1:len(inorder[:i])+1], inorder[:i])
    root.Right = buildTree(preorder[len(inorder[:i])+1:], inorder[i+1:])
    return root
}

题目:从中序与后序遍历序列构造二叉树

题目链接:LeetCode-106. 从中序与后序遍历序列构造二叉树
[Go版]算法通关村第六关青铜——如何使用中序和后序来恢复一颗二叉树_第6张图片

Go代码

func buildTree(inorder []int, postorder []int) *TreeNode {
    length := len(postorder)
    if length == 0 {
        return nil
    }
    root := &TreeNode{Val:postorder[length-1]}
    i:=0
    for ;i<len(inorder); i++ {
        if inorder[i] == root.Val {
            break
        }
    }
    root.Left = buildTree(inorder[:i], postorder[:len(inorder[:i])])
    root.Right = buildTree(inorder[i+1:], postorder[len(inorder[:i]):len(postorder)-1])
    return root
}

你可能感兴趣的:(算法与数据结构,算法,深度优先)