108.将有序数组转换为二叉搜索树
本质就是寻找分割点,分割点作为当前节点,然后递归左区间和右区间
一定要想明白一点就是:因为这是一个有序数组,确定中结点后,其左边一定是他的左子树,右边一定是他的右子树,不需要在判断值的大小了
如果数组长度为偶数,中间节点有两个,取哪一个都可以,只不过构成了不同的平衡二叉搜索树。
# 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]:
root = self.traversal(nums,0,len(nums)-1)
return root
def traversal(self,nums,left,right):
if left > right:
return None
mid = (left + right)//2
root = TreeNode(nums[mid])
root.left = self.traversal(nums,left,mid-1)
root.right = self.traversal(nums,mid+1,right)
return root
538.把二叉搜索树转换为累加树
视频讲解:普大喜奔!二叉树章节已全部更完啦!| LeetCode:538.把二叉搜索树转换为累加树_哔哩哔哩_bilibili
从树中可以看出累加的顺序是右中左,所以我们需要反中序遍历这个二叉树,然后顺序累加就可以了。右中左遍历二叉搜索树数组是递减的。
# 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 __init__(self):
self.pre = 0
def convertBST(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if not root:
return None
self.convertBST(root.right)
root.val += self.pre
self.pre = root.val
self.convertBST(root.left)
return root
二叉树遍历:
后序遍历(即:回溯)实现从底向上的遍历方式(左右中)
前序遍历实现从上往下的遍历方式(中左右)
总结