您的位置:首页 > 其它

重建二叉树

2015-09-23 11:53 218 查看
给定一棵二叉树,假设每个节点都用唯一的字符来表示。

假设已经有了前序遍历和中序遍历的结果,希望通过一个算法重建这棵树。

前序遍历结果: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;
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: