您的位置:首页 > Web前端

剑指offer——重建二叉树

2015-08-05 14:36 357 查看
欢迎转载,请附出处:

/article/1760890.html

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

代码如下:

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int val){
        this.val = val;
    }

}

public class ReconstructTree {
    public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre==null||in==null){
            return null;
        }
      TreeNode tree = reConstructCore(pre,in,0,pre.length-1,0,in.length-1);
      return tree;
    }
    /**
    *核心算法,preStart和preEnd是起始下标和结束下标
    **/
    public static TreeNode reConstructCore(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
        TreeNode tree = new TreeNode(pre[preStart]);
        tree.left = null;
        tree.right= null;

        if(preStart==preEnd&&inStart==inEnd){
            return tree;
        }
        //记录中序遍历中等于前序遍历的第一位的下标
        int inCenter = 0;
        for(inCenter = inStart;inCenter<inEnd;inCenter++){
            if(in[inCenter]==pre[preStart]){
                break;
            }else if (inCenter==inEnd) {
                System.err.println("输入有误,请检查输入!");
            }
        }
        //左子树的长度
        int leftTreeLength = inCenter-inStart;
        //右子数的长度
        int rightTreeLength = inEnd-inCenter;

        if(leftTreeLength>0){
           //递归左子树直到左子树的末端
           tree.left = reConstructCore(pre,in,preStart+1,preStart+leftTreeLength,inStart,inCenter-1);
        }

        if(rightTreeLength>0){
            //递归右子数直到右子数的末端
           tree.right = reConstructCore(pre,in,preStart+leftTreeLength+1,preEnd,inCenter+1,inEnd);
        }
      return tree;   

    }
    /**
     * 后序遍历
     * @param node
     */
    public static void traverseBinTreeRDL(TreeNode node){
        if (node==null) {
            return;
        }
        if (node.left!=null) {
            traverseBinTreeRDL(node.left);
        }
        if(node.right!=null){
            traverseBinTreeRDL(node.right);
        }
        System.out.println(node.val);
    }

    public static void main(String[] args){
        //测试代码
        int pre[] = {1,2,4,7,3,5,6,8};
        int in[]  = {4,7,2,1,5,3,8,6};
        TreeNode tree = reConstructBinaryTree(pre, in);
        traverseBinTreeRDL(tree);

    }

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