0669-修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树不应该改变保留在树中的元素的相对结构(即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在唯一的答案。

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]
示例 2:

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]
示例 3:

输入:root = [1], low = 1, high = 2
输出:[1]
示例 4:

输入:root = [1,null,2], low = 1, high = 3
输出:[1,null,2]
示例 5:

输入:root = [1,null,2], low = 2, high = 4
输出:[2]

提示:

树中节点数在范围 [1, 104] 内
0 <= Node.val <= 104
树中每个节点的值都是唯一的
题目数据保证输入是一棵有效的二叉搜索树
0 <= low <= high <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trim-a-binary-search-tree

参考:

python

# 0669-修剪二叉搜索树

class Solution1:
    def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
        """
        递归
        :param root:
        :param low:
        :param high:
        :return:
        """
        if not root:
            return None
        # 寻找符合区间的节点 [low, high]
        if root.val < low:
            right = self.trimBST(root.right, low, high)
            return right
        if root.val > high:
            left = self.trimBST(root.left, low, high)
            return left
        # 各自接入符合条件的左右孩子
        root.left = self.trimBST(root.left, low, high)
        root.right = self.trimBST(root.right, low, high)

        return root

class Solution2:
    def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
        """
        迭代
        :param root:
        :param low:
        :param high:
        :return:
        """
        if not root:
            return None
        # 处理头结点,root移动到[low, high]范围内
        while root and (root.val < low or root.val > high):
            # 小于low的往右走
            if root.val < low:
                root = root.right
            # 大于high的往左走
            else:
                root = root.left
        cur = root
        # root已经在区间内,处理左孩子小于low的情况
        while cur:
            while cur.left and cur.left.val < low:
                cur.left = cur.left.right
            cur = cur.left
        cur = root
        # root已经在区间内,处理右孩子大于high的情况
        while cur:
            while cur.right and cur.right.val > high:
                cur.right = cur.right.left
            cur = cur.right

        return root

golang

package binaryTree

// 递归
func trimBST(root *TreeNode, low int, high int) *TreeNode {
	if root == nil {
		return nil
	}
	if root.Val < low {
		right := trimBST(root.Right, low, high)
		return right
	}
	if root.Val > high {
		left := trimBST(root.Left, low, high)
		return left
	}

	root.Left = trimBST(root.Left, low, high)
	root.Right = trimBST(root.Right, low, high)

	return root
}


// 迭代
func trimBST2(root *TreeNode, low int, high int) *TreeNode {
	if root == nil {
		return nil
	}

	// 处理root,让root移动到[low, high]
	for root != nil && (root.Val < low || root.Val > high) {
		if root.Val < low {
			root = root.Right
		} else {
			root = root.Left
		}
	}

	// 此时root已经在区间内,处理左孩子元素小于low
	cur := root
	for cur != nil {
		for cur.Left != nil && cur.Left.Val < low {
			cur.Left = cur.Left.Right
		}
		cur = cur.Left
	}

	// 此时root已经在区间内,处理右孩子元素大于high
	cur = root
	for cur != nil {
		for cur.Right != nil && cur.Right.Val > high {
			cur.Right = cur.Right.Left
		}
		cur = cur.Right
	}
	return root
}

posted on 2021-11-19 23:48  进击的davis  阅读(48)  评论(0编辑  收藏  举报

导航