代码随想录视频讲解
代码随想录文章讲解
递归法
- 前序遍历,如果当前节点小于low,则返回trim后的右子树;如果大于high,则返回trim后的左子树(保持BST的特性)
class Solution:
def trimBST(self, root: Optional[TreeNode], low: int, high: int) -> Optional[TreeNode]:
if not root:
return None
if root.val < 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.right = self.trimBST(root.right, low, high)
return root
代码随想录视频讲解
代码随想录文章讲解
递归法
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
if len(nums) == 0:
return
mid = len(nums) // 2
root = TreeNode(nums[mid])
root.left = self.sortedArrayToBST(nums[:mid])
root.right = self.sortedArrayToBST(nums[mid+1:])
return root
递归法2:使用左右指针选择BST的范围
class Solution:
def sortedArrayToBST(self, nums: List[int]) -> Optional[TreeNode]:
def _helper(left, right):
if left > right:
return
mid = left + (right - left) // 2
root = TreeNode(nums[mid])
root.left = _helper(left, mid - 1)
root.right = _helper(mid + 1, right)
return root
return _helper(0, len(nums) - 1)
代码随想录文章讲解
递归法
- 从大到小遍历BST(右中左),在当前节点之前遍历的所有节点的和+当前节点的值就是要求的新的值
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
pre = 0
def _traversal(root):
nonlocal pre
if not root:
return
_traversal(root.right)
root.val += pre
pre = root.val
_traversal(root.left)
_traversal(root)
return root
迭代法
class Solution:
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return None
stack = deque([root])
pre = 0
while stack:
cur = stack.pop()
if cur:
if cur.left:
stack.append(cur.left)
stack.append(cur)
stack.append(None)
if cur.right:
stack.append(cur.right)
else:
cur = stack.pop()
cur.val += pre
pre = cur.val
return root
- 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。
- 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。
- 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。