669. 修剪二叉搜索树
主要是需要注意,虽然当前节点可能出界,但是其左子节点或者右子节点并没有出界。
func trimBST(root *TreeNode, low int, high int) *TreeNode {
if root == nil {
return nil
}
if root.Val < low{
return trimBST(root.Right, low, high)
}
if root.Val > high{
return trimBST(root.Left, low, high)
}
root.Left = trimBST(root.Left, low, high)
root.Right = trimBST(root.Right, low, high)
return root
}
108.将有序数组转换为二叉搜索树
二叉搜索树的中序遍历本来就是有序数组,所以直接截取中间的作为根节点即可。
func sortedArrayToBST(nums []int) *TreeNode {
if len(nums) == 0 {
return nil
}
ret := &TreeNode{Val:nums[len(nums) / 2]}
left := nums[:len(nums) / 2]
right := nums[(len(nums) / 2) + 1 :]
ret.Left = sortedArrayToBST(left)
ret.Right = sortedArrayToBST(right)
return ret
}
538.把二叉搜索树转换为累加树
收获两个,一个是将树的地址的地址传进去,这样就可以改地址了,虽然你也可以传回来两个参数,但是这样更舒服一点(个人感觉)。
第二个就是要注意左子树的首个是怎么接收到右子树的值的,特别是还不能接收重叠了,所以一定要是在叶子节点那里接受传递来的值。
func convertBST(root *TreeNode) *TreeNode {
ret := &root
getsum(*ret, 0)
return root
}
func getsum(node *TreeNode, sum int) int{
if node == nil{
return sum
}
right := getsum(node.Right, sum)
node.Val += right
left := getsum(node.Left, node.Val)
if node.Left == nil{
return node.Val
}
return left
}