重建二叉树

133 阅读1分钟

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

package com.happy.algorithm.codinginterviews;

/**
 */
public class ReconstructTree {


    public TreeNode reConstructBinaryTree(int[] pre, int[] in) {

        if (in == null || pre == null || pre.length == 0 || pre.length != in.length) {
            return null;
        }

        int prePos = 0;
        int start = 0;
        int end = pre.length - 1;

        TreeNode root = construct(pre, in, prePos, start, end);
        return root;


    }

    private TreeNode construct(int[] pre, int[] in, int prePos, int start, int end) {
        TreeNode root = null;
        if (start <= end) {
            root = new TreeNode(pre[prePos]);
            int pos = findPos(in, pre[prePos], start, end);
            root.left = construct(pre, in, prePos + 1, start, pos - 1);
            root.right = construct(pre, in, prePos + pos - start + 1, pos + 1, end);
        }
        return root;
    }

    private int findPos(int[] in, int rootValue, int start, int end) {
        for (int i = start; i <= end; i++) {
            if (in[i] == rootValue) {
                return i;

            }
        }
        return 0;
    }


}

class PreSolution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder == null || inorder == null) {
            return null;
        } else {
            TreeNode root = reConstructBinaryTree2(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
            return root;
        }

    }

    private TreeNode reConstructBinaryTree2(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) {

        if (startPre > endPre || startIn > endIn) {
            return null;
        }

        TreeNode root = new TreeNode(pre[startPre]);

        for (int i = startIn; i <= endIn; i++) {
            if (in[i] == pre[startPre]) {
                if (i == startIn) {
                    root.left = null;
                } else {
                    root.left = reConstructBinaryTree2(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);

                }
                if (i == endIn) {
                    root.right = null;
                } else {
                    root.right = reConstructBinaryTree2(pre, startPre + i - startIn + 1, endPre, in, i + 1, endIn);

                }
                break;
            }
        }

        return root;
    }
}


class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}