给定一棵二叉树,假设每个节点都用唯一的字符来表示。
假设已经有了前序遍历和中序遍历的结果,希望通过一个算法重建这棵树。
前序遍历结果:a b d c e f
中序遍历结果:d b a e c f
/*
* 根据前序和中序遍历重建二叉树,并输出后序遍历
*/
public class RebuildBinaryTree {
public static void main(String[] args) {
char[] preOrder = { 'a', 'b', 'd', 'c', 'e', 'f' };
char[] inOrder = { 'd', 'b', 'a', 'e', 'c', 'f' };
RebuildBinaryTree rebulid = new RebuildBinaryTree();
Node root = rebulid.rebuildBinaryTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
rebulid.postOrder(root);
}
private Node rebuildBinaryTree(char[] pre, int begin1, int end1, char[] in, int begin2, int end2) {
if (begin1 > end1 || begin2 > end2)
return null;
char rootData = pre[begin1];
Node head = new Node(rootData);
int divider = findIndexInArray(in, rootData, begin2, end2);
int offset = divider - begin2 - 1;
head.left = rebuildBinaryTree(pre, begin1 + 1, begin1 + 1 + offset, in, begin2, begin2 + offset);
head.right = rebuildBinaryTree(pre, begin1 + 2 + offset, end1, in, divider + 1, end2);
return head;
}
private int findIndexInArray(char[] a, char x, int begin, int end) {
for (int i = begin; i <= end; i++) {
if (a[i] == x)
return i;
}
return -1;
}
private void postOrder(Node root) {
if (root.left != null) {
postOrder(root.left);
}
if (root.right != null) {
postOrder(root.right);
}
System.out.print(root.value);
}
class Node {
char value;
Node left;
Node right;
public Node(char value) {
this.value = value;
}
public int getValue() {
return value;
}
public void setValue(char value) {
this.value = value;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
}