二叉树的递归

二叉树的创建

  1. 105. 从前序与中序遍历序列构造二叉树

    创建二叉树:首先将根节点的创建过程搞清楚,左右子树按照以上根节点的创建过程递归创建

    思路:前序遍历中第一个节点是根节点,第二个节点是左子树的根节点,第三个节点是右子树的根节点

    中序遍历:根节点左边的是左子树的中序遍历,根节点右边的是右子树的中序遍历

    根据以上两种深度遍历的特点,可以递归地创建二叉树

    根据一棵树的前序遍历与中序遍历构造二叉树。
    
    注意:
    你可以假设树中没有重复的元素。
    
    例如,给出
    前序遍历 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))
    
  2. 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()
    
  3. 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))
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值