重建二叉树

来源:互联网 发布:淘宝办签证泄露信息 编辑:程序博客网 时间:2024/05/02 02:39

给定一棵二叉树,假设每个节点都用唯一的字符来表示。
假设已经有了前序遍历和中序遍历的结果,希望通过一个算法重建这棵树。
前序遍历结果: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;        }    }}
0 0
原创粉丝点击