首页 » 算法 » 正文

已知先序及中序遍历,重建二叉树

package cn.pbdata.util;

public class PreMidToAfter {

    public class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        public TreeNode(){
            left = null;
            right = null;
        }
    }
    
    public TreeNode rebuild(int[] pre,int[] mid){
        return rebuild(pre,0,pre.length-1,mid,0,mid.length-1);
    }
    
    public TreeNode rebuild(int[] pre,int ps,int pe,int[] mid,int ms,int me){
        if(pre == null || pre.length == 0 || mid == null || mid.length==0){
            return null;
        }
        if(ps > pe){
            return null;
        }
        int val = pre[ps];
        TreeNode root = new TreeNode();
        root.val = val;
        
        int index;
        for(index = ms ; index <= me;index++){
            if(val == mid[index]){
                break;
            }
        }
        
        int leftPreStart = ps + 1;
        int leftPreEnd = ps + index - ms;
        int leftMidStart = ms;
        int leftMidEnd = index - 1;
        
        root.left = rebuild(pre,leftPreStart,leftPreEnd,mid,leftMidStart,leftMidEnd);
        
        int rightPreStart = ps + index -ms + 1;
        int rightPreEnd  = pe;
        int rightMidStart = index + 1;
        int rightMidEnd = me;
        root.right = rebuild(pre,rightPreStart,rightPreEnd,mid,rightMidStart,rightMidEnd);
        return root;
    }
    public void preView(TreeNode root){
        if(root == null){
            return;
        }
        System.out.print(root.val);
        preView(root.left);
        preView(root.right);
    }
    public void midView(TreeNode root){
        if(root == null){
            return;
        }
        midView(root.left);
        System.out.print(root.val);
        midView(root.right);
    }
    public void lastView(TreeNode root){
        if(root == null){
            return;
        }
        lastView(root.left);
        lastView(root.right);
        System.out.print(root.val);
    }
    
    
    public static void main(String[] args){
        PreMidToAfter pt = new PreMidToAfter();
        int[] pre = { 1, 2, 4,7,3,5,6,8};
        int[] mid = {4,7,2,1,5,3,8,6};
        TreeNode node1 = pt.rebuild(pre, mid);
        pt.preView(node1); 
        System.out.println("");
        pt.midView(node1);
        System.out.println("");
        pt.lastView(node1);
        System.out.println("");
        
    }
}

发表评论