【tree】【 由中根序遍历与后根序遍历生成树】【由先根序与中根序遍历生成树】

递归思想,找到根节点,问题便分解为左子树与右子树

leetcode 106. Construct Binary Tree from Inorder and Postorder Traversal


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) { 
         int size = inorder.length;
         if(size==0) return null;
         return buildTreefromin_post(inorder, 0, size-1, postorder, 0, size-1); 
    }
    
    private TreeNode buildTreefromin_post(int[] inorder, int l_in, int r_in,
                                         int[] postorder, int l_p, int r_p){
         TreeNode root = new TreeNode(0); 
         // System.out.println(l_in);
         // System.out.println(r_in);
         root.val = postorder[r_p];
         if(l_in==r_in)  return root;
         int mid = 0;
         for(int k=l_in;k<=r_in;k++){
             if(inorder[k]==root.val){
                 mid = k;
                 break;
             }
         }
         // System.out.println(mid);
         if(l_in<=mid-1){
            root.left = buildTreefromin_post(inorder, l_in, mid-1, postorder, l_p, l_p + mid-1-l_in);
         }
         if(mid+1<=r_in){
            root.right = buildTreefromin_post(inorder, mid+1, r_in, postorder, r_p-1+mid+1-r_in , r_p-1);
         }
         return root;
    }
}


105. Construct Binary Tree from Preorder and Inorder Traversal

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
         int size = inorder.length;
         if(size==0) return null;
         return buildTreefromin_post(inorder, 0, size-1, preorder, 0, size-1); 
    }
    
    private TreeNode buildTreefromin_post(int[] inorder, int l_in, int r_in,
                                          int[] preorder, int l_p, int r_p){
         TreeNode root = new TreeNode(0); 
         // System.out.println(l_in);
         // System.out.println(r_in);
         root.val = preorder[l_p];
         if(l_in==r_in)  return root;
         int mid = 0;
         for(int k=l_in;k<=r_in;k++){
             if(inorder[k]==root.val){
                 mid = k;
                 break;
             }
         }
         // System.out.println(mid);
         if(l_in<=mid-1){
            root.left = buildTreefromin_post(inorder, l_in, mid-1, preorder, l_p+1, l_p + mid-l_in);
         }
         if(mid+1<=r_in){
            root.right = buildTreefromin_post(inorder, mid+1, r_in, preorder, r_p+mid+1-r_in , r_p);
         }
         return root;
    }
}


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