07. 重建二叉树

07. 重建二叉树

image.png

补充知识:

一、须要定义二叉树类数组

public class TreeNode {
   int val;
   TreeNode left;//左节点
   TreeNode right;//右节点
   TreeNode(int x) { val = x; }
}

二、二叉树的遍历方式
简单来讲
image.png
前序遍历:根左右:A, B, D, E, C, F, G
中序遍历:左根右:D, B, E, A, F, C, G
后序遍历:左右根:D, E, B, F, G, C, A
层序遍历:按层从左到右访问:优化

[
 [A],
 [B,C],
 [D,E,F,G]
]
二叉树的遍历(前序遍历、中序遍历、后序遍历、层序遍历)
“遇到二叉树,基本是 递归

思想:

首先序获得,就能从序中分出左子树和右子树。分出的左子树,再从序获得它的,就能从序中分出它的左子树和右子树,分出的右子树,再从序获得它的,就能从序中分出它的左子树和右子树....spa

总结下来就是,前序获得根,中序分左右子树。
再明确一下左右子的在 序的范围,用left right来表示;
以及根在 序的位置 root,和根在 序的位置 i。

假设一个二叉树,.net

已知此序的root,left,right,inorder_root,length=(0,0,8,5,9)

image.png
前序:987216543
中序:271869453code

  • 用前序的根[9]分:
    前序:[9],87216543
    中序:[27186],[9],[453]
    分得前序:[9],[87216],[543]
    获得
    左子树1:前序:87216
    左子树1:中序:27186blog

    该序的root,left,right,inorder_root=(1,0,4,3)(root+1,left,i-1,i)

    右子树1:前序:543
    右子树1:中序:453递归

    该序的root,left,right,inorder_root=(6,6,8,7)
    (root+(i-left)+1,i+1,right,i)

    image.png

后面以此类推索引

  • 用左子树1的前序的根[8]分:
    左子树1:前序:[8],7216
    左子树1:中序:[271],[8],[6]
    获得
    左子树2:前序:721
    左子树2:中序:271
  • 用左子树2的前序的根[7]分:
    左子树2:前序:[7],21
    左子树2:中序:[2],[7],[1]

以此类推右子树。
但一直都以最开始的序列为参考写索引位置。ci

操做:

image.png

  • 注意:
    一、把中序装入HashMap,且数字是键值(不能重复),索引是内容。
    二、判断left>right就是null,
    三、HashMap获得键值的方法get(val)
    一个优化思路:用HashMap,不用数组,用数组就超时了。
    image.png
    image.png
相关文章
相关标签/搜索