对于一颗二叉树的遍历序列而言,先序遍历和后序遍历可以很容易找到根节点,而中序遍历方便将左右子树分离开来,
所以我们就可以很轻易的使用两个序列将一颗二叉树还原起来
如下图这棵树:
先序序列:A B D E H C F G
中序序列:D B E H A F C G
后序序列: D H E B F G C A
以先序中序为例:
先序的第一个节点A,就是整个树的根节点。而从中序中找到根节点,在左边的就是左子树右边的就是右子树
接着重复上述步骤,继续找到先序的下一个节点B,从中序找到B节点继续分两份
这样不断重复循环,直到将所有序列遍历完全,整棵树就建立好了。
很容易看出,这是一个递归的想法,将问题不断拆分
现在,我们将思路代码化:
class Node{
char val;
Node left;
Node right;
}
public static Node buildTree1(List<Character> preorder,List<Character> inorder){
char rootValue = preorder.get(0); //获取先序的第一个节点即整颗树的根节点
int leftCount = inorder.indexOf