重建二叉树

来源:互联网 发布:微信多帐号登录软件 编辑:程序博客网 时间:2024/05/16 02:42

题目

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

思路

(1)由前序遍历结果确定根结点
(2)查找根结点在中序遍历序列中的位置,由此确定左子树和右子树,即中序遍历中根结点左侧的序列为左子树序列,右侧为右子树序列
(3)根据以上方式查找每个子树的根结点,重建左右子树,此步骤通过递归实现

实现

class TreeNode{    int val;    TreeNode left;    TreeNode right;    TreeNode(int x){        this.val=x;    }}public class ConstructBinaryTree{    public TreeNode reConstructBinaryTree(int[] preOrder,int[] inOrder){        return constructCore(preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);    }    //find root according to preOrder and inOrder    private TreeNode constructCore(int[] preOrder,int startPreOrder,int endPreOrder,int[] inOrder,int startInOrder,int endInorder){        int rootValue=preOrder[startPreOrder];        //find rootValue according to preOrder        TreeNode rootNode=new TreeNode(rootValue);    //create rootNode        rootNode.left = null;        rootNode.right = null;        //only one node,return rootNode        if(startPreOrder==endPreOrder){            if(startInOrder==endInorder && preOrder[startPreOrder]==inOrder[startInOrder]){                return rootNode;            }        }        //find the order of rootNode in inOrder        int rootOfInOrder = startInOrder;        while (rootOfInOrder <= endInorder && inOrder[rootOfInOrder] != rootValue){            rootOfInOrder++;        }        //deal with exception        if(rootOfInOrder == endInorder && inOrder[rootOfInOrder] != rootValue){            return null;        }        //calculate the length of leftTree        int leftSubTreeLength = rootOfInOrder - startInOrder;        //calculate the Subscript of leftSubTree's last node        int leftIndexOfPreOrderEnd = startPreOrder + leftSubTreeLength;        //reConstruct leftSubTree        if(leftSubTreeLength>0){            rootNode.left = constructCore(preOrder,startPreOrder+1,leftIndexOfPreOrderEnd,inOrder,startInOrder,rootOfInOrder-1);        }        //reConstruct rightSubTree        if(leftSubTreeLength < endPreOrder - startPreOrder){            rootNode.right = constructCore(preOrder,leftIndexOfPreOrderEnd+1,endPreOrder,inOrder,rootOfInOrder+1,endInorder);        }        return rootNode;    }    //main function for test    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 root=new ConstructBinaryTree().reConstructBinaryTree(pre,in);        System.out.println(root);    }}
原创粉丝点击