【二叉树】leetcode669.修剪二叉搜索树

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

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。
【二叉树】leetcode669.修剪二叉搜索树_第1张图片
【二叉树】leetcode669.修剪二叉搜索树_第2张图片

解答:
方法一:递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
        if not root:
            return root
        if root.val<low:
            return self.trimBST(root.right,low,high)
        if root.val>high:
            return self.trimBST(root.left,low,high)
        #root值在[low,high]之间,要保留root结点
        root.left=self.trimBST(root.left,low,high)
        root.right=self.trimBST(root.right,low,high)
        return root

方法二:迭代

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def trimBST(self, root: TreeNode, low: int, high: int) -> TreeNode:
        #1.处理根节点root, 将root移动到[low,high]范围内
        while root and (root.val<low or root.val>high):
            if root.val<low:
                root=root.right
            elif root.val>high:
                root=root.left
        if not root:
            return None

        #2.修剪左子树, 处理左孩子元素小于low的情况
        cur=root
        while cur:
            while cur.left and cur.left.val<low:
                cur.left=cur.left.right
            #当前cur.left的值在[low,high]之间了 或者cur.left为空
            cur=cur.left

        #3.修剪右子树, 处理右孩子元素大于high的情况
        cur=root
        while cur:
            while cur.right and cur.right.val>high:
                cur.right=cur.right.left
            #当前cur.right的值在[low,high]之间了 或者cur.right为空
            cur=cur.right

        return root

你可能感兴趣的:(leetcode,Python,leetcode,算法,职场和发展)