目录

遍历序列还原二叉树

一棵二叉树的前序遍历序列为ABDHEICFG, 中序遍历序列为HDBEIACGF, 后序遍历序列为HDIEBGFCA

  1. 必须已知二叉树的中序遍历序列, 才能唯一确定这棵二叉树, 题目一定会给出中序遍历序列。
  2. 前序遍历序列的第一个节点一定是二叉树的根节点, 比如节点A。
  3. 后序遍历序列的最后一个节点一定是二叉树的根节点, 比如节点A。
  4. 中序遍历序列中, 左子树节点一定在根节点的左侧, 比如HDBEI都在A的左侧;右子树节点同理。这样可避免画错二叉树。
  1. 由前序遍历序列ABDHEICFG可知根节点为A, 又因中序遍历序列HDBEIACGF中, HDBEI都在A的左侧, 可知HDBEI都是A的左子树节点, 同理CGF都是A的右子树节点。

     graph TB
         A((A)) --- HDBEI
         A --- CGF
    
  2. 对于前序遍历序列中BDHEI这棵子树, B是根节点, 由中序遍历序列HDBEI可知HDB的左子树节点, EIB的右子树节点。

     graph TB
         A((A)) --- B((B)) --- HD
         B --- EI
         A --- CGF
    
  3. 对于前序遍历序列中DH这棵子树, D是根节点, 由中序遍历序列HD可知HD的左子树节点。同理, 对于前序遍历序列中EI这棵子树, E是根节点, 由中序遍历序列EI可知IE的右子树节点。

    graph TB
        A((A)) --- B((B)) --- D((D)) --- H((H))
        D ~~~ n1(( ))
        style n1 opacity:0
        B --- E((E)) ~~~ n2(( ))
        style n2 opacity:0
        E --- I((I))
        A --- CGF
    
  4. 对于前序遍历序列中CFG这棵子树, C是根节点, 由中序遍历序列CGF可知GFC的右子树节点。

    graph TB
        A((A)) --- B((B)) --- D((D)) --- H((H))
        D ~~~ n1(( ))
        style n1 opacity:0
        B --- E((E)) ~~~ n2(( ))
        style n2 opacity:0
        E --- I((I))
        A --- C((C)) ~~~ n3(( ))
        style n3 opacity:0
        C --- GF
    
  5. 对于前序遍历序列中FG这棵子树, F是根节点, 由中序遍历序列GF可知GF的左子树节点。得到答案:

    graph TB
        A((A)) --- B((B)) --- D((D)) --- H((H))
        D ~~~ n1(( ))
        style n1 opacity:0
        B --- E((E)) ~~~ n2(( ))
        style n2 opacity:0
        E --- I((I))
        A --- C((C)) ~~~ n3(( ))
        style n3 opacity:0
        C --- F((F)) --- G((G))
        F ~~~ n4(( ))
        style n4 opacity:0
    
  1. 由后序遍历序列HDIEBGFCA可知根节点为A, 又因中序遍历序列HDBEIACGF中, HDBEI都在A的左侧, 可知HDBEI都是A的左子树节点, 同理CGF都是A的右子树节点。

     graph TB
         A((A)) --- HDBEI
         A --- CGF
    
  2. 对于后序遍历序列中HDIEB这棵子树, B是根节点, 由中序遍历序列HDBEI可知HDB的左子树节点, EIB的右子树节点。

     graph TB
         A((A)) --- B((B)) --- HD
         B --- EI
         A --- CGF
    
  3. 对于后序遍历序列中HD这棵子树, D是根节点, 由中序遍历序列HD可知HD的左子树节点。同理, 对于后序遍历序列中IE这棵子树, E是根节点, 由中序遍历序列EI可知IE的右子树节点。

    graph TB
        A((A)) --- B((B)) --- D((D)) --- H((H))
        D ~~~ n1(( ))
        style n1 opacity:0
        B --- E((E)) ~~~ n2(( ))
        style n2 opacity:0
        E --- I((I))
        A --- CGF
    
  4. 对于后序遍历序列中GFC这棵子树, C是根节点, 由中序遍历序列CGF可知GFC的右子树节点。

    graph TB
        A((A)) --- B((B)) --- D((D)) --- H((H))
        D ~~~ n1(( ))
        style n1 opacity:0
        B --- E((E)) ~~~ n2(( ))
        style n2 opacity:0
        E --- I((I))
        A --- C((C)) ~~~ n3(( ))
        style n3 opacity:0
        C --- GF
    
  5. 对于后序遍历序列中GF这棵子树, F是根节点, 由中序遍历序列GF可知GF的左子树节点。

    graph TB
        A((A)) --- B((B)) --- D((D)) --- H((H))
        D ~~~ n1(( ))
        style n1 opacity:0
        B --- E((E)) ~~~ n2(( ))
        style n2 opacity:0
        E --- I((I))
        A --- C((C)) ~~~ n3(( ))
        style n3 opacity:0
        C --- F((F)) --- G((G))
        F ~~~ n4(( ))
        style n4 opacity:0
    
  1. 画一张表, 在第一列, 从上到下填入前序遍历序列 (或者从下到上填入后序遍历序列)。

  2. 在第一行, 从左到右填入中序遍历序列。

  3. 当行与列的节点相同时, 即确定该节点位置, 最后按照位置关系将节点连线得到二叉树。

  4. 连接时, 注意核实各节点相对于其父节点的左右位置。

    中序遍历序列中, 左子树节点一定在根节点的左侧, 比如HDBEI都在A的左侧;右子树节点同理。

前序和中序HDBEIACGF
AA
BB
DD
HH
EE
II
CC
FF
GG
后序和中序HDBEIACGF
AA
CC
FF
GG
BB
EE
II
DD
HH

得到答案:

graph TB
    A((A)) --- B((B)) --- D((D)) --- H((H))
    D ~~~ n1(( ))
    style n1 opacity:0
    B --- E((E)) ~~~ n2(( ))
    style n2 opacity:0
    E --- I((I))
    A --- C((C)) ~~~ n3(( ))
    style n3 opacity:0
    C --- F((F)) --- G((G))
    F ~~~ n4(( ))
    style n4 opacity:0