题目链接:669. 修剪二叉搜索树 - 力扣(LeetCode)
思路:本体需要删除多个节点,如果节点不符合区间要求 (1)若当前节点小于low,则去当前节点的右节点寻找一个符合的节点返回给当前节点的父节点;(2)若当前节点大于high,则去当前节点的左节点寻找一个复合的节点返回给当前节点的父节点。
每一轮递归
if root.val < low:
去right寻找节点
if root.val > high:
去left寻找节点
root.left = 找到节点并用left接收
root.right = 找到节点并用right接收
class Solution(object):
def trimBST(self, root, low, high):
"""
:type root: TreeNode
:type low: int
:type high: int
:rtype: TreeNode
"""
if root == None:
return None
print(root.val)
if root.val < low: #如果当前节点小于low 代表要向右寻找
return self.trimBST(root.right, low, high)
if root.val > high:
return self.trimBST(root.left, low, high)
root.left = self.trimBST(root.left, low, high) #找root.left
root.right = self.trimBST(root.right, low, high)#找root.right
return root
题目链接:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)
思路:总体思路跟中序后序构建二叉树思路一样,就是查找root的方式不同
class Solution(object):
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
def createTree(nums):
if len(nums) == 0:
return None
index = len(nums) // 2
root = TreeNode(nums[index])
root.left = createTree(nums[0:index])
root.right = createTree(nums[index+1:])
return root
return createTree(nums)
题目链接:538. 把二叉搜索树转换为累加树 - 力扣(LeetCode)
思路:观察累加值,发现遍历顺序是右中左
class Solution(object):
def convertBST(self, root):
"""
:type root: TreeNode
:rtype: TreeNode
"""
# 右 中 左
self.pre = None
def travel(root):
if root == None:
return
travel(root.right)
if self.pre == None:
self.pre = root
else:
root.val += self.pre.val
self.pre = root
travel(root.left)
travel(root)
return root