题目
给你二叉搜索树的根节点root ,同时给定最小边界low和最大边界high;通过修剪二叉搜索树,使得所有节点的值在[low, high]中;
修剪树不应该改变保留在树中的元素的相对结构(即如果没有被移除,原有的父代子代关系都应当保留);可以证明,存在唯一的答案。
所以结果应当返回修剪好的二叉搜索树的新的根节点;注意,根节点可能会根据给定的边界发生改变。
提示:
树中节点数在范围[1, 104]内,0 <= Node.val <= 104
树中每个节点的值都是唯一的
题目数据保证输入是一棵有效的二叉搜索树
0<= low <= high <= 104
思路
当node.val>high,说明当前节点以及右子数都在范围之外,则递归处理其左子数即可;
当node.val< low,说明当前节点以及左子数都在范围之外,则递归处理其右子数即可;
其他情况正常递归处理即可。
代码
package leetcode
import(
"log"
"encoding/json"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// trimBST
// 修剪二叉搜索树
// @param root 二叉树
// @param low 最小边界
// @param high 最大边界
func trimBST(root *TreeNode, low int, high int) *TreeNode {
if root == nil {
return root
}
/*
data := &TreeNode{
Val: 2,
Left: &TreeNode{Val: 1},
Right: &TreeNode{
Val: 4,
Left: &TreeNode{Val: 3},
Right: &TreeNode{Val: 6},
},
}
*/
// [3, 5]
// 当前节点大于最大边界,则当前节点及右节点已经越界,所以只保留左子数
if root.Val > high {
root = trimBST(root.Left, low, high)
return root
}
// 当前节点小于最小边界,则当前节点及左节点已经越界,所以值保留右子数
if root.Val < low {
root = trimBST(root.Right, low, high)
rs, _ := json.Marshal(root)
log.Println(string(rs))
return root
}
root.Left = trimBST(root.Left, low, high)
root.Right = trimBST(root.Right, low, high)
return root
}
参考
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/tr…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。