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)
相关推荐
让我们一起加油好吗13 分钟前
【基础算法】多源 BFS
c++·算法·bfs·宽度优先·多源bfs
B站计算机毕业设计之家18 分钟前
深度学习实战:python动物识别分类检测系统 计算机视觉 Django框架 CNN算法 深度学习 卷积神经网络 TensorFlow 毕业设计(建议收藏)✅
python·深度学习·算法·计算机视觉·分类·毕业设计·动物识别
And_Ii32 分钟前
LeetCode 3350. 检测相邻递增子数组 II
数据结构·算法·leetcode
想唱rap35 分钟前
C++ string类的使用
开发语言·c++·笔记·算法·新浪微博
JAVA学习通35 分钟前
Replication(下):事务,一致性与共识
大数据·分布式·算法
胖咕噜的稞达鸭36 分钟前
C++中的父继子承(2)多继承菱形继承问题,多继承指针偏移,继承组合分析+高质量习题扫尾继承多态
c语言·开发语言·数据结构·c++·算法·链表·c#
蓝色汪洋39 分钟前
Completed String easy
算法
铭哥的编程日记41 分钟前
贪心算法精选30道编程题 (附有图解和源码)
算法·贪心算法
CoovallyAIHub43 分钟前
顶刊新发!上海交大提出PreCM:即插即用的旋转等变卷积,显著提升分割模型鲁棒性
人工智能·算法·计算机视觉
超级大只老咪1 小时前
哈希表(算法)
java·算法·哈希算法