由遍历序列确定二叉树
先序+中序
主要思路
先在先序序列中找树根,也就是第一个元素,然后在中序序列中找到这个元素,进而确定左右子树,也就是此元素左边和右边的。
例子
先序:A B D E C F G H
后序:D B E A C G F H
在先序中找到树根A
,在后序中确定其左子树包含D B E
,右子树包含C G F H
,然后递归进行这个过程。
确定二叉树为:
graph TD A((A)) === B((B)) A === C((C)) B === D((D)) B === E((E)) C -.- t(( )) C === F((F)) F === G((G)) F === H((H))
注:C并没有左孩子结点,图中的虚线连接的结点只是用来占位的
代码
1 | /// <summary> |
后序+中序
主要思路
先在后序序列中找树根,也就是最后一个元素,然后在中序序列中找到这个元素,进而确定左右子树,也就是此元素左边和右边的。
例子
后序:D E B G H F C A
中序:D B E A C G F H
在后序中找到树根A
,在中序里确定其左子树包含D B E
,右子树包含C G F H
,之后递归进行这个过程。
确定二叉树为:
graph TD A((A)) === B((B)) A === C((C)) B === D((D)) B === E((E)) C -.- t(( )) C === F((F)) F === G((G)) F === H((H))
代码
1 | /// <summary> |
层序+中序
主要思路
先在层序序列中找到树根,也就是第一个,然后在中序序列中找到这个元素,然后可以确定在中序序列中的左右子树,也就是这个元素的左边和右边的。但是在层序中,这个元素的左右子树并不是连续分布的,准确来说,在层序中会穿插左子树和右子树的元素。
例子
层序:A B C D E F G H
中序:D B E A C G F H
在层序中找到树根A
,在中序里确定其左子树包含D B E
,右子树包含C G F H
。但是在层序中,左子树的D B E
里穿插了C
,右子树的C G F H
穿插了D
和E
,总之不能像之前一样设置数组的L
和R
就直接进入下一步递归。这里需要将左右子树对应层序中的元素分别提取出来,作为子层序序列
,然后进入下一步递归。
代码
1 | /// <summary> |
相关文章