day21-binary tree-part08-7.23

tasks for today:

  1. 699.修建二叉搜索树

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

  3. 538.把二叉搜索树转化为累加树


  1. 699.修建二叉搜索树

IN this practice, the feature of being binary search tree is very important, this can help trim the tree speedily.

when in "if root.val < low:" this condition, the left child tree can be totally trimed, because this is a binary search tree. All the left child value is less than the value of current root.

Note: Please compare the difference between this practice and the practice 450.

python 复制代码
# 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 trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
        if root is None:
            return None
        
        if root.val < low:
            # when in this condition, the left child tree can be totally trimed, because this is a binary search tree
            return self.trimBST(root.right, low, high)
        elif root.val > high:
            # when in this condition, the right child tree can be totally trimed, because this is a binary search tree
            return self.trimBST(root.left, low, high)

        root.left = self.trimBST(root.left, low, high)
        root.right = self.trimBST(root.right, low, high)

        return root

one question: if I follow the logic of practice 450, it sometimes work well, but sometimes return fause solution, I mean: it is true that if a node's value is outside the range [low, high], the entire subtree rooted at that node needs to be trimmed, but I wonder, if I follow the logic of deleting a node to trim the tree, although it is more clumsy, but that should also work, the difference is I transaction the trimming a subtree into trimming nodes one-buy-one, why it sometimes not work, and sometimes work.

This problem might be created by the traverse order issue, because based on the example caser, some removed node is not correctly remove becasue some pitential trace back in the recursive algorithm. [2,1,3], low=3, high=4, [3] is expected but [3,1] is returned.

But this problem is not in delete node, maybe because the judging condition of root.val > key or root.val < key.

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

this practice's target is build a tree, so the key idea is to identify the val for construct current root node and the corresponding list feed into it for its following branches construction.

python 复制代码
# 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

        new_node = TreeNode(nums[int((len(nums)-1)/2)])

        new_node.left = self.sortedArrayToBST(nums[:int((len(nums)-1)/2)])
        new_node.right = self.sortedArrayToBST(nums[int((len(nums)-1)/2)+1:])
        
        return new_node
  1. 538.把二叉搜索树转化为累加树

for a binary seach tree, the inorder search is a ascending list, to calculate the sum of values larger than cur node, the inorder shoudl be reversed, which makes a descending list, by adding the nums before the value of current node, the cur tree node's value can be given to cur root node for upate.

Noted: when there are variables in recursive, a self.XXX definition should be necessary.

python 复制代码
# 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 convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
        # when there is variable in the recursive, this from should be used
        self.pre = 0
        self.rev_inorder(root)

        return root

    def rev_inorder(self, node):
        if node is None:
            return
        
        self.rev_inorder(node.right)
        node.val += self.pre
        self.pre = node.val
        self.rev_inorder(node.left)
相关推荐
算AI4 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh6 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之7 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓7 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf7 小时前
图论----拓扑排序
算法·图论
我要昵称干什么7 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ8 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl8 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦8 小时前
日期类的实现
数据结构·c++·算法
ChoSeitaku8 小时前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯