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)
相关推荐
那个村的李富贵6 小时前
CANN加速下的AIGC“即时翻译”:AI语音克隆与实时变声实战
人工智能·算法·aigc·cann
power 雀儿6 小时前
Scaled Dot-Product Attention 分数计算 C++
算法
琹箐7 小时前
最大堆和最小堆 实现思路
java·开发语言·算法
renhongxia17 小时前
如何基于知识图谱进行故障原因、事故原因推理,需要用到哪些算法
人工智能·深度学习·算法·机器学习·自然语言处理·transformer·知识图谱
坚持就完事了7 小时前
数据结构之树(Java实现)
java·算法
算法备案代理8 小时前
大模型备案与算法备案,企业该如何选择?
人工智能·算法·大模型·算法备案
赛姐在努力.8 小时前
【拓扑排序】-- 算法原理讲解,及实现拓扑排序,附赠热门例题
java·算法·图论
野犬寒鸦9 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
霖霖总总9 小时前
[小技巧66]当自增主键耗尽:MySQL 主键溢出问题深度解析与雪花算法替代方案
mysql·算法
rainbow68899 小时前
深入解析C++STL:map与set底层奥秘
java·数据结构·算法