算法:二叉树的重建

来源:互联网 发布:sql 多个结果合并 编辑:程序博客网 时间:2024/05/22 03:08

首先前序遍历特性,根节点在第一个,然后后面是左子树,然后是右子树。
而中序遍历,首先出现的是左子树,然后是根节点,然后是右子树。
然后就可以用递归方法,将前序遍历的第一个数值和中序遍历比较,找到中序遍历中的根节点。中序遍历中的该节点左边为左子树,右边为右子树。再用同样的方法找到左右子树的根节点,依次递归

/** * Definition for binary tree * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {      public TreeNode reConstructBinaryTree(int[] pre,int[] in) {        TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);        return root;    }    /*     *     * @param PreOrder     *            前序遍历序列     * @param startPreIndex     *            前序序列开始位置     * @param endPreIndex     *            前序序列结束位置     * @param InOrder     *            中序遍历序列     * @param startInIndex     *            中序序列开始位置     * @param endInIndex     *            中序序列结束位置     */    private TreeNode reConstructBinaryTree(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]){//中序遍历等于前序遍历的第一个时,这个点作为一个根节点,左边的是左树,右边的右树                root.left=reConstructBinaryTree(                        pre,startPre+1,startPre+i-startIn,in,startIn,i-1);                //递归                // 前序遍历中:下一个的左树的根节点是前序遍历数组的第二个,结束位置是(i-中序开始+前序开始)                // 中序遍历中:下个左树的根节点是开始,结束是i-1                root.right=reConstructBinaryTree(                        pre,i-startIn+startPre+1,endPre,in,i+1,endIn);                //前序遍历中: 右树的根节点是前序遍历数组的第(i+1-中序开始+前序开始)结束位置是前序结尾                //中序遍历中:右树是i+1----结尾            }        }        return root;    }}
public class TreeNode {     int val;    TreeNode left;    TreeNode right;   TreeNode(int x) { val = x; } }
原创粉丝点击