[leetCode106] 从中序和后序遍历构造树

原理就是,每次从后续遍历的尾部取出一个元素,以这个元素为分割点, 将中序和后序序列分为两边,再分别在两边里面做递归 代码容易出错,所以最好加上调试语句,方便找错

public class Solution {
          
   

    public TreeNode buildTree(int[] inorder, int[] postorder) {
          
   
        TreeNode root = new TreeNode();
        if (inorder.length == 0) return root;
        root=traversal(inorder,0,inorder.length-1,postorder,0,postorder.length-1);
        return root;
    }

    public TreeNode traversal(int[] inorder, int inLeft, int inRight, int[] postorder, int postLeft, int postRight) {
          
   
        if (postLeft > postRight || inLeft > inRight) return null;
        int val=postorder[postRight];
        System.out.println("val:"+val);
        System.out.println("inleft:"+inLeft+"   inright:"+inRight+"     postleft:"+postLeft+"   postright:"+postRight);
        TreeNode root=new TreeNode(val);
        if (postLeft == postRight || inLeft == inRight) return root;
        int inPtr;
        for ( inPtr=inLeft;inPtr<inRight;inPtr++){
          
   
            if (inorder[inPtr]==val)    break;
        }
        
        int num=inPtr-inLeft;
        int postPtr=postLeft+num;
        
        System.out.println("inptr:"+inPtr+"   postPtr"+postPtr);
        System.out.println("-------------");
        System.out.println("inorder left:");
        for (int i=inLeft;i<=inPtr-1;i++)
            System.out.println(inorder[i]);
        System.out.println("inorder right:");
        for (int i=inPtr+1;i<=inRight;i++)
            System.out.println(inorder[i]);
        System.out.println("postorder left");
        for (int i=postLeft;i<=postPtr-1;i++)
            System.out.println(postorder[i]);
        System.out.println("postorder right");
        for (int i=postPtr;i<=postRight-1;i++)
            System.out.println(postorder[i]);

        TreeNode leftNode=traversal(inorder,inLeft,inPtr-1,postorder,postLeft,postPtr-1);
        TreeNode rightNode=traversal(inorder,inPtr+1,inRight,postorder,postPtr,postRight-1);

        root.left=leftNode;
        root.right=rightNode;
        return root;
    }
}
经验分享 程序员 微信小程序 职场和发展