[代码随想录]Day20-二叉树part09

发布时间 2023-08-17 20:15:23作者: WtcSky

题目:669. 修剪二叉搜索树

思路:

遍历到的值小于最小值,说明左子树里的所有节点都小于最小值,舍弃左子树。

遍历到的值大于最大值,说明右子树里的所有节点都大于最大值,舍弃右子树。

如果在范围内,就拼接左右子树然后返回节点

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
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. 将有序数组转换为二叉搜索树

思路:

每次找中间的位置作为根,然后添加左右子树即可

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func sortedArrayToBST(nums []int) *TreeNode {
    lens := len(nums) 
    if lens == 0 {
        return nil
    }
    lens = lens / 2 //  找中点
    root := &TreeNode{ // 创建根节点
        Val:nums[lens],
        Left: sortedArrayToBST(nums[:lens]), // 建立左子树
        Right: sortedArrayToBST(nums[lens+1:]), // 建立右子树
    }
    return root
}

参考:

代码随想录

题目:538. 把二叉搜索树转换为累加树

思路:

image.png

也就是说按照右中左的顺序递归,同时和二叉树:搜索树的最小绝对差 (opens new window)二叉树:我的众数是多少?一样都需要记录上一个节点。

代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
var pre *TreeNode
func convertBST(root *TreeNode) *TreeNode {
    pre = nil
    step(root)
    return root
}

func step(root *TreeNode) {
    if root == nil {
        return 
    }
    step(root.Right) // 右
    if pre != nil { // 中
        root.Val = pre.Val + root.Val   
    }
    pre = root // 完成当前节点再去修改
    step(root.Left) // 左
    return
} 

参考:

代码随想录