//给出二叉树的前序中序还原出这个二叉树(利用给出的两个List进行写)
public static Node buildTree1(List<Character> preorder, List<Character> inorder) {
if (preorder.size() == 0) { // 前序的长度为0
return null;
}
char rootValue = preorder.get(0); //找到根节点,根结点的位置在前序的0下标处
int leftCount = inorder.indexOf(rootValue); //在中序遍历中查找根结点的位置,leftCount:根结点左边的元素有几个元素
Node root = new Node(rootValue); //新建一个结点, 将找到的这个根结点的值赋给它
List<Character> leftPreorder = preorder.subList(1, 1 + leftCount);//subLists就是一个函数(表示取值 左闭右开)
//对于先序,"根左右"的'左"边这一部分
List<Character> leftInorder = inorder.subList(0, leftCount);//对于中序,找"左根右"中的"左"这一部分
Node left = buildTree1(leftPreorder, leftInorder); //返回循环了一遍.继续往下寻找下一个左子树
root.left = left; //表示根结点的左子树,循环,往下继续寻找下一个根结点的左子树
List<Character> rightPreorder = preorder.subList(1 + leftCount, preorder.size());
List<Character> rightInorder = inorder.subList(leftCount + 1, inorder.size());
Node right = buildTree1(rightPreorder, rightInorder);
root.right = right;
return root;
}
public static void main(String[] args){
List<Character> preorder = Arrays.asList('A','B','D','E','G','C','F','H');
List<Character> inorder = Arrays.asList('D','B','G','E','A','C','F','H');
Node root = buildTree1(preorder, inorder);
System.out.println("成功");
}