AVL 树刷题

导读:本篇文章讲解 AVL 树刷题,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

面试题 04.06. 后继者

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

class Solution:
    def inorderSuccessor(self, root: TreeNode, p: TreeNode) -> TreeNode:
        ans = None
        cur = root
        while cur:
            if cur.val <= p.val:
                cur = cur.right
            else:
                ans = cur
                cur = cur.left
        return ans

450. 删除二叉搜索树中的节点

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def predeccessor(self, root):
        temp = root.right
        while temp.left: temp = temp.left
        return temp
    def deleteNode(self, root: Optional[TreeNode], key: int) -> Optional[TreeNode]:
        if not root: return None
        if key < root.val:
            root.left = self.deleteNode(root.left, key)
        elif key > root.val:
            root.right = self.deleteNode(root.right, key)
        else:
            if not root.left or not root.right:
                return root.left if root.left else root.right
            else:
                temp = self.predeccessor(root)
                root.val = temp.val
                root.right = self.deleteNode(root.right, temp.val)
        return root

1382. 将二叉搜索树变平衡

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildTree(self, nodes, l, r):
        if l > r: return None
        mid = (l + r) // 2
        root = nodes[mid]
        root.left = self.buildTree(nodes, l, mid - 1)
        root.right = self.buildTree(nodes, mid + 1, r)
        return root
    def inorder(self, root, ans):
        if not root: return
        self.inorder(root.left, ans)
        ans.append(root)
        self.inorder(root.right, ans)
        return 
    def balanceBST(self, root: TreeNode) -> TreeNode:
        nodes = []
        self.inorder(root, nodes)
        return self.buildTree(nodes, 0, len(nodes) - 1)

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

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
        if not nums: return None
        mid = (len(nums) - 1) // 2
        root = TreeNode(nums[mid])
        root.left = self.sortedArrayToBST(nums[:mid])
        root.right = self.sortedArrayToBST(nums[mid+ 1:])
        return root 

98. 验证二叉搜索树

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorder(self, root):
        if not root: return True
        if not self.inorder(root.left): return False
        if self.pre and self.pre.val >= root.val:
            return False
        self.pre = root
        if not self.inorder(root.right): return False
        return True 
    def isValidBST(self, root: Optional[TreeNode]) -> bool:
        self.pre = None
        return self.inorder(root)

501. 二叉搜索树中的众数

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def inorder(self, root, res):
        if not root: return 
        self.inorder(root.left, res)
        if self.pre.val == root.val:
            self.cur_count += 1
        else:
            self.cur_count = 1
            self.pre = root
        if self.max_count == self.cur_count:
            res.append(root.val)
        elif self.max_count < self.cur_count:
            self.max_count = self.cur_count
            res *= 0
            res.append(root.val)
        self.inorder(root.right, res)
        return 
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        res = []
        self.cur_count = 0
        self.max_count = 0
        self.pre = root
        self.inorder(root, res)
        return res

面试题 17.12. BiNode

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

class Solution:
    def inorder(self, root):
        if not root: return 
        self.inorder(root.left)
        root.left = None
        self.pre.right = root
        self.pre = root
        self.inorder(root.right)
    def convertBiNode(self, root: TreeNode) -> TreeNode:
        head = TreeNode(0)
        self.pre = head
        self.inorder(root)
        return head.right

剑指 Offer 33. 二叉搜索树的后序遍历序列

class Solution:
    def inorder(self, nums, l, r):
        if l > r: return True 
        mid = l 
        while nums[mid] < nums[r]: mid += 1
        if not self.inorder(nums, l, mid - 1):
            return False
        if self.pre !=  -1 and nums[self.pre] > nums[r]:
            return False
        self.pre = r
        if not self.inorder(nums, mid, r - 1):
            return False
        return True
    def verifyPostorder(self, postorder: List[int]) -> bool:
        self.pre = -1
        return self.inorder(postorder, 0, len(postorder) - 1)
        

1008. 前序遍历构造二叉搜索树

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def buildtree(self, nums):
        if len(nums) <= 0: return None
        mid = 1
        while len(nums) > mid and nums[mid] < nums[0]: mid += 1
        root = TreeNode(nums[0])
        root.left = self.buildtree(nums[1: mid])
        root.right = self.buildtree(nums[mid:])
        return root
    def bstFromPreorder(self, preorder: List[int]) -> Optional[TreeNode]:
        return self.buildtree(preorder)

面试题 04.09. 二叉搜索树序列

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

class Solution:
    def fun1(self, s1, s2):
        if not s1: return [s2]
        if not s2: return [s1]
        result = []
        for data in self.fun1(s1[1:], s2):
            result.append([s1[0]] + data)
        for data in self.fun1(s1, s2[1:]):
            result.append([s2[0]] + data)
        return result
    def merge(self, left, right):
        result = []
        for l in left:
            for r in right:
                result.extend(self.fun1(l, r))
        return result
    def BSTSequences(self, root: TreeNode) -> List[List[int]]:
        if not root: return [[]]
        left = self.BSTSequences(root.left)
        right = self.BSTSequences(root.right)
        return [[root.val] + data for data in self.merge(left, right)]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76877.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!