leetcode-1382. 將二叉搜尋樹變平衡

AI_Younger_Man發表於2020-09-27
  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 之間。

思路:
樹的問題用的最多的就是遞迴求解:
先用中序遍歷把原來的二叉樹的元素放到vals陣列裡面,然後從下到上那個構造二叉平衡。
二叉平衡樹的要求:左右子樹的高度差不能 > 1
在這裡插入圖片描述

構造BST的時候,m妨礙中間,遞迴從下往上構建,書的問題一般都用遞迴,看程式碼

# 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:
        vals = []

        def inorder(root: TreeNode):
            if not root:
                return None
            inorder(root.left)
            vals.append(root.val)
            inorder(root.right)

        def build(l: int, r: int):  # 構建從L到R的BST
            if l > r:
                return None

            m = int(l + (r-l)/2)  # 因為m的座標是中間位置,可以保證BSt的性質
            root = TreeNode(vals[m])
            root.left = build(l, m-1)
            root.right = build(m+1, r)

            return root
        
        inorder(root)
        return build(0, len(vals)-1)

相關文章