1. 修剪二叉搜索树
LeetCode569. 力扣
给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案 。
所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
图1. 修剪二叉搜索树示例
分析:
(1)对于当前节点的值:
如果当前的节点<下界,那么,看该节点的右子树(看比较大的一边);若当前节点>上界,那么,看该节点的左子树(看比较小的一边);
(2)对当前节点的左右子树:
如果当前节点的右节点>上界,看右节点的左子树是否满足上界条件(小于上界),若满足,则将当前节点的右指针指向右节点的左子树;
如果当前节点的左节点<下界,看左节点的右子树是否满足下界条件(大于下界),若满足,则将当前节点的左指针指向左节点的右子树。
每一个节点都是如此,因此结构为递归结构。
2. 将有序数组转化为二叉搜索树
LeetCode108. 力扣
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
图2. 将有序数组转化为二叉搜索树
分析,以数组[-10, -3, 0, 5, 9]为例,
首先,为了保障二叉搜索树为一个平衡树,那么,左右子树的节点个数必须保证不能相差太大,因此,选取的根节点为中间的节点,索引为i = int(len(nums)/2)
(1)若 i 不是最后一个元素,则其右子树为:
nums[i+1 : ]
构造平衡二叉搜索树的方式同理;
(2)若 i 不是第一个元素,则其左子树为:
nums[ : i]
构造平衡二叉搜素树的方式同理。
由该分析知,构造该平衡二叉搜素树的算法为递归结构。
3. 代码
# Definition for a binary tree node.
class TreeNode(object):
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def set_left(self, left):
self.left = left
def set_right(self, right):
self.right = right
class Solution(object):
def trimBST(self, root, low, high):
"""
:type root: TreeNode
:type low: int
:type high: int
:rtype: TreeNode
"""
current = root
if current.val < low:
if current.right != None:
return self.trimBST(current.right, low, high)
else:
return None
elif current.val > high:
if current.left != None:
return self.trimBST(current.left, low, high)
else:
return None
if current.left != None:
if current.left.val < low:
if current.left.right != None:
current.left = self.trimBST(current.left.right, low, high)
else:
current.left = None
else:
current.left = self.trimBST(current.left, low, high)
if current.right != None:
if current.right.val > high:
if current.right.left != None:
current.right = self.trimBST(current.right.left, low, high)
else:
current.right = None
else:
current.right = self.trimBST(current.right, low, high)
return root
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
i = int(len(nums)/2)
root = TreeNode(nums[i])
if i == len(nums)-1:
root.right = None
else:
root.right = self.sortedArrayToBST(nums[i+1:])
if i == 0:
root.left = None
else:
root.left = self.sortedArrayToBST(nums[:i])
return root