代码随想录算法训练营第二十一天 | 二叉树part08
669 修剪二叉搜索树
思路:这是一棵二叉搜索树,那么肯定是有顺序的,就像上面给的两个示例,留下的树的大致样子是不会改变的。
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
108 将有序数组转换为二叉搜索树
思路:这个题目算是简单的,只需要对nums数组进行递归遍历。
不过我们要注意,要转换成的是一棵平衡二叉树,所以需要先取到中间的数。
if not nums:
return
mid_idx = len(nums) // 2
root_val = nums[mid_idx]
root = TreeNode(root_val)
root.left = self.sortedArrayToBST(nums[:mid_idx])
root.right = self.sortedArrayToBST(nums[mid_idx+1 : ])
return root
538 把二叉搜索树转换为累加树
思路:这个题首先看到的时候没啥感觉,很迷茫,但是如果仔细看对应的新数,会发现是从最右边的孩子开始进行计算的。 首先加父节点,然后再加父节点的左节点,也就是自己的兄弟,很明显的是满足 右中左的顺序。 所以可以通过递归来做这一道题,那既然要用到孩子传过来的值,那就需要用到回溯了。 首先是递归到最右下角的节点,然后创建一个新的节点,值就是本身,再回溯到其父节点,创建一个节点,值是子节点的值加父节点的值。
上面的思路复杂了,直接进行右左中的遍历,然后改变对应的值就行了,很简单的思路。
self.sum_ = 0
def dfs(node):
if not node:
return
dfs(node.right)
self.sum_ += node.val
node.val = self.sum_
dfs(node.left)
dfs(root)
return root