数据结构与算法:二叉搜索树相关力扣题:108.将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

lc108.将有序数组转换为二叉搜索树

说是转换为二叉搜索树,其实是平衡二叉搜索树。

代码一:转化为二叉搜索树

如果是普通二叉搜索树的话,如下代码就可以了

    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        root_val = nums[0]
        root = TreeNode(root_val)
        def init_BST(node, val):
            if not node:
                return TreeNode(val)
            if val < node.val:
                node.left = init_BST(node.left, val)
            else:
                node.right = init_BST(node.right, val)
            return node
        for i in range(1, len(nums)):
            init_BST(root, nums[i])
        return root

代码二:转换为平衡二叉搜索树

因为我们拿到的是一个有序数组,所以我们选取一个位置居中的数,递归分治左右两区间分别为左子树和右子树即可。

class Solution(object):
    def sortedArrayToBST(self, nums):
        """
        :type nums: List[int]
        :rtype: TreeNode
        """
        def traversal(left, right):
            # 定义左闭右闭
            if left>right:
                return None
            mid = (left+right)>>1
            mid_node = TreeNode(nums[mid])
            mid_node.left = traversal(left,mid-1)
            mid_node.right = traversal(mid+1, right)
            return mid_node
        root = traversal(0, len(nums)-1)
        return root

因为用了位运算加速,所以效率是35ms,击败90.83%。如果没有用位运算的话,大概是击败70%左右。

lc538. 把二叉搜索树转换为累加树

class Solution(object):
    def convertBST(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        def postorder(node, pre_val):
            if not node:
                return None
            postorder(node.right, pre_val)
            node.val += pre_val[0]
            pre_val[0] = node.val
            postorder(node.left, pre_val)
            return node
        root = postorder(root, [0])
        return root

效率:55ms,击败60.06%

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸡鸭扣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值