99. 恢复二叉搜索树

python 复制代码
#中序遍历,寻找插值位置并交换
# 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 recoverTree(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        #记录中序遍历的值
        nums = []
        self.inorder(root, nums)
        print(nums)
        x,y = self.swappos(nums)
        self.swap(root,2,x,y)

        #找到替换值的位置
    def inorder(self, root, nums):
        if root:
            self.inorder(root.left,nums)
            nums.append(root.val)
            self.inorder(root.right,nums)

    def swappos(self, nums):
        n = len(nums)
        index1 = -1
        index2 = -1
        for i in range(n-1):
            if nums[i+1] < nums[i]:
                index1 = i+1
                if index2 == -1:
                    index2 = i
                else:
                    break
        x,y = nums[index2], nums[index1]
        return [x,y]
    def swap(self, root, count, num1, num2):
        if root:
            if root.val == num1 or root.val == num2:
                root.val = num2 if root.val == num1 else num1
                count -= 1
                if count == 0:
                    return
            self.swap(root.left, count, num1, num2)
            self.swap(root.right, count, num1, num2)
python 复制代码
#边中序遍历,边判断

# 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 recoverTree(self, root):
        stack = []
        x, y = None, None
        prev = None
        #迭代形式的中序遍历:借助栈
        while stack or root:
            #遍历左子树
            while root:
                stack.append(root)
                root = root.left
            #左子树遍历完,root为null
            root = stack.pop()

            if prev and root.val < prev.val:
                x = root
                if y == None:
                    y = prev
                else:
                    break
            #这个root判断完,将其赋予prev
            prev = root
            root = root.right
        self.swap(x,y)
    def swap(self,x,y):
        tmp = y.val
        y.val = x.val
        x.val = tmp
python 复制代码
#moriss遍历
class Solution:
    def recoverTree(self, root):
        x, y, pred, predecessor = None, None, None, None

        while root:
            if root.left:
                predecessor = root.left
                while predecessor.right and predecessor.right != root:
                    predecessor = predecessor.right
                if predecessor.right == None:
                    predecessor.right = root
                    root = root.left

                else:
                    predecessor.right = None
                    root = root.right
            else:
                root = root.right
python 复制代码
# 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 recoverTree(self, root):
        x, y, pred, predecessor = None, None, None, None

        while root:
            if root.left:
                predecessor = root.left
                while predecessor.right and predecessor.right != root:
                    predecessor = predecessor.right
                if predecessor.right == None:
                    predecessor.right = root
                    root = root.left

                else:
                    if pred and root.val < pred.val:
                        #y为后面那个值
                        y = root
                        if not x:
                            x = pred
                    pred = root

                    predecessor.right = None
                    root = root.right
            else:
                if pred and root.val < pred.val:
                    y = root
                    if not x:
                        x = pred
                pred = root
                root = root.right
        x.val,y.val = y.val,x.val

                

                
相关推荐
java1234_小锋1 小时前
[免费]基于Python的影视数据可视化分析系统(Flask+echarts)【论文+源码+SQL脚本】
python·信息可视化·flask·python影视分析·python电影分析
Xの哲學1 小时前
TCP 连接管理:深入分析四次握手与三次挥手
网络·网络协议·算法
精致先生3 小时前
Streamlit实现Qwen对话机器人
python·机器人·大模型·streamlit
华清远见成都中心4 小时前
基于深度学习的异常检测算法在时间序列数据中的应用
人工智能·深度学习·算法
蜀中廖化4 小时前
机器学习:基于OpenCV和Python的智能图像处理 实战
python·opencv·机器学习
java1234_小锋5 小时前
一周学会Matplotlib3 Python 数据可视化-绘制热力图(Heatmap)
开发语言·python·信息可视化·matplotlib·matplotlib3
এ᭄画画的北北5 小时前
力扣-347.前K个高频元素
算法·leetcode
程序员岳焱6 小时前
Java 调用 Python 脚本:实现 HelloWorld
java·后端·python
R-G-B6 小时前
【P27 4-8】OpenCV Python——Mat类、深拷贝(clone、copyTo、copy)、浅拷贝,原理讲解与示例代码
人工智能·python·opencv·浅拷贝·深拷贝·opencv python·mat类
码界筑梦坊7 小时前
135-基于Spark的抖音数据分析热度预测系统
大数据·python·数据分析·spark·毕业设计·echarts