由先序序列/后序序列和中序序列构造二叉树

假设树的先序序列和中序序列分别为
preorder = {7,10,4,3,1,2,8,11}
inorder = {4,10,3,1,7,11,8,2}
1.将中序序列存储在hashmap中,key存储节点的值,value存储节点在中序序列中的下标。

public void map(int[] order){
        int n = order.length;
        for(int i = 0;iorder[i], i);
        }

    }

2.利用先序序列和中序序列构造,代码如下;

//index为本次递归所对应树的根节点在先序序列的下标
//n 为该树的节点数
//off 为该树在中序序列中左边界,通过off和根节点在中序序列的下标 便可得出左子树的节点数
//preorder,index 对应于先序序列
//n,off对应于中序序列
 public TreeNode buildPre(int[] preorder,int index,int n ,int off){

        if(0==n){
            return null;
        }

        int rootVal = preorder[index];
        TreeNode root = new TreeNode(rootVal);
        //hashMap.get(rootVal)获得该树根节点在中序序列中的下标,该下标减去该树对应的左边界off
        //即为该根节点对应的左子树的节点个数
        int i = hashMap.get(rootVal)-off; //i为左子树的节点个数
        //对左子树递归,先序遍历格式为{ 根,{左子树},{右子树} },若根节点下标为index,则
        //其左子树的根节点下标为index+1.左子树在中序序列的左边界为off
        root.left = buildPre(preorder,index+1,i,off);
        //在先序序列{ 根,{左子树},{右子树} }中,由于知道的左子树节点个数i,便可知道右子树的根
        //所对应的下标index+i+1
        //该树节点数n 减去左子树节点数i和1 即为右子树节点数。
        //由于中序序列为{{左子树},根,{右子树} },hashMap.get(rootVal)+1 即为右子树根
        //在中序序列中的左边界
        root.right = buildPre(preorder,index+i+1,n-i-1,hashMap.get(rootVal)+1);
        return root;    
    }

3.利用后序序列和中序序列构造:

public TreeNode buildPost(int[] hostorder,int index,int n ,int off){

        if(n == 0){
            return null;
        }

        int rootVal = hostorder[index];//获得根节点
        TreeNode t = new TreeNode(rootVal);

        int i = off - hashMap.get(rootVal);//得到右子树节点的个数
        t.right = buildPost(hostorder,index-1,i,off);
        t.left = buildPost(hostorder,index-i-1,n-i-1,hashMap.get(rootVal)-1);
        return t;



    }

可以找个例子,模拟程序运行下,便对程序的运行过程更清晰一些。
参考:http://blog.csdn.net/sgbfblog/article/details/7783935#comments

你可能感兴趣的:(算法)