wuyijia

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树,108. 将有序数组转换为二叉搜索树,538. 把二叉搜索树转换为累加树

[参考链接]

669. 修剪二叉搜索树

 需要递归修剪。

[代码]

复制代码
 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def trimBST(self, root, low, high):
 9         """
10         :type root: TreeNode
11         :type low: int
12         :type high: int
13         :rtype: TreeNode
14         """
15         if not root:
16             return None
17          # 若当前root节点小于左界:只考虑其右子树,用于替代更新后的其本身,抛弃其左子树整体
18         if root.val < low:
19             return self.trimBST(root.right, low, high)
20         # 若当前root节点大于右界:只考虑其左子树,用于替代更新后的其本身,抛弃其右子树整体   
21         if root.val > high:
22             return self.trimBST(root.right, low, hight)
23         
24         if low <= root.val <= high:
25             root.left = self.trimBST(root.left, low, high)
26             root.right = self.trimBST(root.right, low, high)
27             # 返回更新后的剪枝过的当前节点root
28             return root
复制代码

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

【注意】

1.选举中间节点,分左右区间,递归遍历左右区间,构造左右子树-----平衡二叉树。

2.数组长度是偶数怎么取中间节点?取哪个都没关系。

3.区间定义很重要。取左闭右闭。

【代码】

复制代码
 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def sortedArrayToBST(self, nums):
 9         """
10         :type nums: List[int]
11         :rtype: TreeNode
12         """
13         '''
14         构造二叉树:重点是选取数组最中间元素为分割点,左侧是递归左区间;右侧是递归右区间
15         必然是平衡树
16         左闭右闭区间
17         '''
18         root = self.traversal(nums,0,len(nums)-1)
19         return root
20     
21     def traversal(self, nums,left,right):
22         #停止条件左闭右闭,所以没有等于
23         if(left > right):
24             return None
25         # 确定左右界的中心,防越界
26         mid = left + (right - left) // 2
27         # 构建根节点
28         mid_root = TreeNode(nums[mid])
29         # 构建以左右界的中心为分割点的左右子树
30         mid_root.left = self.traversal(nums, left, mid-1)
31         mid_root.right = self.traversal(nums, mid+1, right)
32 
33         # 返回由被传入的左右界定义的某子树的根节点
34         return mid_root
复制代码

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

【注意】

1.换一个角度来看,这就是一个有序数组[2, 5, 13],求从后到前的累加数组,也就是[20, 18, 13]。

2.从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。

3.双指针。pre是前一个节点的数值。中间节点是处理逻辑。pre定义为数值型而不定义树就不会发生空指针异常。

【代码】

复制代码
 1 # Definition for a binary tree node.
 2 # class TreeNode(object):
 3 #     def __init__(self, val=0, left=None, right=None):
 4 #         self.val = val
 5 #         self.left = left
 6 #         self.right = right
 7 class Solution(object):
 8     def __init__(self):
 9         self.pre = 0
10 
11     def convertBST(self, root):
12         """
13         :type root: TreeNode
14         :rtype: TreeNode
15         """
16         pre = 0
17         if not root:
18             return None
19         #
20         self.convertBST(root.right)
21         #
22         self.pre += root.val
23         root.val = self.pre
24         #
25         self.convertBST(root.left)
26 
27         return root
复制代码

 

posted on   小吴要努力  阅读(5)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示