二叉树

重建二叉树:

题目描述

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

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

public class BinaryTree1 {
    public TreeNode reConstructBinaryTree(int[] pre, int[] in) {
        int rootValue = pre[0];
        TreeNode root = new TreeNode(rootValue);
        root.left = null;
        root.right = null;
        int len = in.length;
        if (len == 1 && pre[0] == in[0]) {
            return root;
        }
        int index = 0;
        for (int i = 0; i < len; i++) {
            if (in[i] == rootValue){
                index = i;
                break;
            }
                
        }
        int leftNum = index;
        int rightNum = len - 1 - index;

        if (leftNum > 0) {
            int[] preLeftSub = new int[leftNum];
            System.arraycopy(pre, 1, preLeftSub, 0, leftNum);

            int[] inLeftSub = new int[leftNum];
            System.arraycopy(in, 0, inLeftSub, 0, leftNum);

            root.left = reConstructBinaryTree(preLeftSub, inLeftSub);
        }

        if (rightNum > 0) {

            int[] preRightSub = new int[rightNum];
            System.arraycopy(pre, leftNum + 1, preRightSub, 0, rightNum);

            int[] inRightSub = new int[rightNum];
            System.arraycopy(in, index + 1, inRightSub, 0, rightNum);

            root.right = reConstructBinaryTree(preRightSub, inRightSub);

        }

        return root;

    }
    
    
    
    /**
     * 递归打印出二叉树
     */


    /**
     * 从根结点开始遍历,从树的最高层叶子结点开始输出,从左至右
     * @param node    当前的结点
     */

    void printTree(TreeNode node) {
        if(node == null){
            return;
        }else{
            
            printTree(node.left);
            System.out.print(node.val+"  ");
            printTree(node.right);
            
        }
        
    }
}

测试用例:

import junit.framework.TestCase;
public class BinaryTree1Test extends TestCase{
    public void test(){
        BinaryTree1 bt = new BinaryTree1();
        int[] a ={1,2,3,4,5,6,7};
        int[] b ={3,2,4,1,6,5,7};
        bt.printTree(bt.reConstructBinaryTree(a, b));
    }
}
原文地址:https://www.cnblogs.com/hixin/p/4626535.html