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
相關文章
相關標籤/搜索