中等题
94. 二叉树的中序遍历
https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
不使用递归的方法
def inorderTraversal(self, root: TreeNode) -> List[int]:
self.result = []
self.nodelist = []
p = root
while p != None or self.nodelist:
while p != None:
self.nodelist.append(p)
p = p.left
p = self.nodelist.pop()
self.result.append(p.val)
p = p.right
return self.result
105. 从前序与中序遍历序列构造二叉树
https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
抓住前序和中序的特点,前序遍历(根节点先行),中序遍历(根节点左侧数字是左子树,右侧是右子树)。
先通过前序数组找根节点,接着通过中序得到左右子树数组长度,然后在前序数组中找到左子树根和右子树根。递归向下
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
if not preorder:
return None
root = TreeNode(preorder[0])
inorder_mid = inorder.index(preorder[0])
root.left = self.buildTree(preorder[1:1+len(inorder[:inorder_mid])], inorder[0:inorder_mid])
root.right = self.buildTree(preorder[1+len(inorder[:inorder_mid]):], inorder[inorder_mid+1:])
return root
106. 从中序与后序遍历序列构造二叉树
https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
和上题类似
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
if not postorder:
return None
tmp = postorder.pop()
root = TreeNode(tmp)
index = inorder.index(tmp)
left_len = len(inorder[:index])
root.left = self.buildTree(inorder[:index], postorder[:left_len])
root.right = self.buildTree(inorder[index+1:],postorder[left_len:])
return root