30-Day Leetcoding Challenge Day20

因为题为二叉搜索树,所以递增序列为中序遍历,可将本题转化为leetcode105

1.已知前序,中序遍历,递归求二叉树

2.已知前序,中序遍历,迭代求二叉树

/**
 * 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> inorder_map = new HashMap<>();
    List<Integer> lpre = new LinkedList<>();
    public TreeNode bstFromPreorder(int[] preorder) {
        int[] pre = new int[preorder.length];
        int[] inorder = new int[preorder.length];
        for(int i = 0; i < preorder.length; i++){
            pre[i] = preorder[i];
            inorder[i] = preorder[i];
        }
        Arrays.sort(inorder);
        for(int i = 0; i < inorder.length; i++){
            inorder_map.put(inorder[i], i);
        }
        for(int i = 0; i < pre.length; i++){
            lpre.add(pre[i]);
        }
        return helper(0, inorder.length);
    }
    public TreeNode helper(int left, int right){
        if(left >= right)return null;
        int temp = lpre.get(0);
        lpre.remove(0); //List没有pop方法,用这两句代替
        TreeNode root = new TreeNode(temp);
        root.left = helper(left, inorder_map.get(temp));
        root.right = helper(inorder_map.get(temp)+1, right);
        return root;
    }
}
class Solution {
    public TreeNode bstFromPreorder(int[] preorder) {
        int n = preorder.length;
        if(n == 0) return null;
        TreeNode root = new TreeNode(preorder[0]);
        Deque<TreeNode> deque = new ArrayDeque<TreeNode>();
        deque.addLast(root);
        for(int i = 1; i < n; i++){
            TreeNode node = deque.getLast();
            TreeNode child = new TreeNode(preorder[i]);
            while(!deque.isEmpty() && deque.getLast().val < child.val){//!!!很重要
                node = deque.removeLast();//bug 没有赋值给node
            }
            if(node.val < child.val)node.right = child;
            else node.left = child;
            deque.addLast(child);
        }
        return root;
    }
}

Python3

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

class Solution:
    def bstFromPreorder(self, preorder: List[int]) -> TreeNode:
        inorder = sorted(preorder)
        def helper(i, j):
            if i >= j:
                return None
            root = TreeNode(preorder[0])
            del preorder[0]
            root.left = helper(i, inorder_map[root.val])
            root.right = helper(inorder_map[root.val]+1, j)
            return root
        inorder_map = {val:index for index, val in enumerate(inorder)}
        return helper(0, len(inorder)) # bug 这里不是len(inorder)-1
class Solution:
    def bstFromPreorder(self, preorder: List[int]) -> TreeNode:
        n = len(preorder)
        if n == 0:
            return None
        root = TreeNode(preorder[0])
        stack = []
        stack.append(root)
        for i in range(1, n):
            node = stack[-1]
            child = TreeNode(preorder[i])
            while stack and stack[-1].val < child.val:
                node = stack.pop()
            if node.val < child.val:
                node.right = child
            else:
                node.left = child
            stack.append(child)
        return root

猜你喜欢

转载自www.cnblogs.com/yawenw/p/12806113.html