【LeetCode 1382】将二叉搜索树变平衡

1. 题目描述

给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。

如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。

如果有多种构造方法,请你返回任意一种。

示例:

在这里插入图片描述

输入:root = [1,null,2,null,3,null,4,null,null]
输出:[2,1,3,null,null,null,4]
解释: 这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。

提示:

树节点的数目在 1 到 10^4 之间。
树节点的值互不相同,且在 1 到 10^5 之间。

2. 第一种方法

因为要变平衡,所以又要找中点。

  • 常规思路就是先搞个中序遍历,获得一个升序序列;
  • 然后搞个重建二叉树,获得序列的中点,将其转换为根节点,再依次递归重建左子树和右子树;
  • 最后回到主函数依次调用上面两个辅助函数即可。
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def balanceBST(self, root: TreeNode) -> TreeNode:
        self.result = []
        self.inorder(root)
        return self.rebuildTree(0, len(self.result) - 1)

    def inorder(self, root):
        if not root:
            return None
        self.inorder(root.left)
        self.result.append(root.val)
        self.inorder(root.right)
    
    def rebuildTree(self, left, right):
        if left > right:
            return None
        mid = (left + right) // 2
        root = TreeNode(self.result[mid])
        root.left = self.rebuildTree(left, mid - 1)
        root.right = self.rebuildTree(mid + 1, right)
        return root

3. 第二种方法

大体看上去跟第一种没多大区别,但是不知为何就是比第一种要快一些,贴出来对比一下

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def balanceBST(self, root: TreeNode) -> TreeNode:
        if root == None:
            return None
        res = []
        self.mid_sort(root, res)
        return self.createBST(res, 0, len(res)-1)

    # 中序遍历
    def mid_sort(self, root, res):
        if root:
            if root.left:
                self.mid_sort(root.left, res)
            res.append(root)
            if root.right:
                self.mid_sort(root.right, res)
    # 创建BST
    def createBST(self, res, l_idx, r_idx):    
        mid = (l_idx + r_idx) // 2
        mid_point = res[mid]
        mid_point.left = None
        mid_point.right = None
        if l_idx < mid:
            mid_point.left = self.createBST(res, l_idx, mid-1)
        if r_idx > mid:
            mid_point.right = self.createBST(res, mid+1, r_idx)
        return mid_point
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值