二叉树的创建
-
创建二叉树:首先将根节点的创建过程搞清楚,左右子树按照以上根节点的创建过程递归创建
思路:前序遍历中第一个节点是根节点,第二个节点是左子树的根节点,第三个节点是右子树的根节点
中序遍历:根节点左边的是左子树的中序遍历,根节点右边的是右子树的中序遍历
根据以上两种深度遍历的特点,可以递归地创建二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7
代码:
# 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: val_index = {val:index for index, val in enumerate(inorder)} def helper(l, r): if l>=r: return None root_val = preorder.pop(0) index = val_index[root_val] root = TreeNode(root_val) root.left = helper(l,index) root.right = helper(index+1, r) return root return helper(0, len(inorder))
-
106. 从中序与后序遍历序列构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [9,15,7,20,3] 返回如下的二叉树: 3 / \ 9 20 / \ 15 7
思路:后续遍历的特点:最后一个节点是根节点,倒数第二个节点是右子树的根节点,依次是右子树的右根节点,右子树的左根节点。。。
# 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, inorder: List[int], postorder: List[int]) -> TreeNode: index_val = {val:index for index, val in enumerate(inorder)} def helper(l=0, r=len(inorder)): if l>=r: return None root_val = postorder.pop() root = TreeNode(root_val) index = index_val[root_val] root.right = helper(index+1, r) root.left = helper(l,index) return root return helper()
-
108. 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
思路:二叉搜索树特点:根节点大于左子树的值,小于右子树的值;且左右子树也都是二叉搜索树
平衡搜索树的特点:节点的左右子树的高度之差小于等于1
根节点的值是有序数组的中间值
# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def sortedArrayToBST(self, nums: List[int]) -> TreeNode: def helper(l,r): if l>=r: return None m = (l+r)//2 root_val = nums[m] root = TreeNode(root_val) root.left = helper(l, m) root.right = helper(m+1, r) return root return helper(0, len(nums))