算法-leetcode-669

210 阅读1分钟

题目

给你二叉搜索树的根节点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…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。