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; } }