leetcode-105-从前序与中序遍历构造二叉树

题目描述:

  

方法一:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        def helper(in_left=0,in_right=len(inorder)):
            nonlocal pre_idx 
            # if there is no elements to construct subtrees 
            if in_left == in_right: return None 
            # pick up pre_idx element as a root 
            root_val = preorder[pre_idx] 
            root = TreeNode(root_val) 
            # root splits inorder list 
            # into left and right subtrees 
            index = idx_map[root_val] 
            # recursion 
            pre_idx += 1 
            # build left subtree 
            root.left = helper(in_left, index) 
            # build right subtree 
            root.right = helper(index + 1, in_right) 
            return root 
        # start from first preorder element 
        pre_idx = 0 
        # build a hashmap value -> its index 
        idx_map = {val:idx for idx, val in enumerate(inorder)} 
        return helper()

 另:

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        def helper(i,j):
            while i<j:
                root = TreeNode(preorder[0])
                del preorder[0]
                root.left = helper(i,idx_map[root.val])
                root.right = helper(idx_map[root.val]+1,j)
                return root
        idx_map = {val:idx for idx, val in enumerate(inorder)} 
        return helper(0,len(inorder))

 java版:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    Map<Integer,Integer> dic = new HashMap<>();
    int [] po;
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        po = preorder;
        for(int i = 0; i< inorder.length;i++)
            dic.put(inorder[i],i);
        return recur(0,0,inorder.length -1);
    }
    public TreeNode recur(int pre_root,int in_left,int in_right){
        if(in_left > in_right) return null;
        TreeNode root = new TreeNode(po[pre_root]);
        int i = dic.get(po[pre_root]);
        root.left = recur(pre_root + 1,in_left, i -1);
        root.right = recur(pre_root + i - in_left + 1,i + 1,in_right);
        return root;
    }
}

迭代:java *

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if(preorder == null || preorder.length == 0){
            return null;
        }
        TreeNode root = new TreeNode(preorder[0]);
        int length = preorder.length;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        int inorderIndex = 0;
        for (int i = 1; i < length; i++){
            int preorderVal =preorder[i];
            TreeNode node = stack.peek();
            if (node.val != inorder[inorderIndex]) {
                node.left = new TreeNode(preorderVal);
                stack.push(node.left);
            }else{
                while(!stack.isEmpty() && stack.peek().val == inorder[inorderIndex]){
                    node = stack.pop();
                    inorderIndex++;
                }
                node.right = new TreeNode(preorderVal);
                stack.push(node.right);
            }
        }
        return root;
    }
}

 

posted @ 2019-07-14 17:20  oldby  阅读(206)  评论(0编辑  收藏  举报