因为题为二叉搜索树,所以递增序列为中序遍历,可将本题转化为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