首页 > 其他分享 >99. 恢复二叉搜索树(中)

99. 恢复二叉搜索树(中)

时间:2023-12-07 15:47:18浏览次数:27  
标签:pre 遍历 val 中序 二叉 99 搜索 nodes 节点

目录

题目

  • 给你二叉搜索树的根节点 root ,该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下,恢复这棵树 。

法一、中序遍历

class Solution:
    def recoverTree(self, root: TreeNode) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        firstNode = None  #用于记录需要交换的节点
        secondNode = None
        pre = TreeNode(float("-inf")) #辅助变量,记录遍历过程中的前一个节点

        stack = []#创建一个栈,用于遍历二叉树
        p = root  #p 作为当前遍历的节点
        while p or stack: #当 p 不为空或栈不为空时,进行循环。
            while p:#将节点 p 及其左子节点依次入栈,直到左子节点为空。
                stack.append(p)
                p = p.left
            p = stack.pop() #出栈一个节点 p,并进行以下判断
            
            if not firstNode and pre.val > p.val:#如果 firstNode 为空且 pre.val > p.val,
                    firstNode = pre
            if firstNode and pre.val > p.val:#如果 firstNode 不为空且 pre.val > p.val,则说明第一个错误节点已记录,并且当前节点 p 与其前一个节点 pre 顺序颠倒,即找到了第二个错误节点。将其赋值给 secondNode。           
                secondNode = p
            pre = p#更新 pre 为当前节点 p,用于下一次比较
            p = p.right#将 p 更新为其右子节点,继续下一轮循环
        firstNode.val, secondNode.val = secondNode.val, firstNode.val#交换两个错误的节点
#由于函数要求修改原始树的节点值,而不是返回新的树,因此直接交换了节点的值,而没有返回任何内容。  

法二、中序遍历+排序

  • 排序的中序遍历和未排序的中序遍历不同节点交换
class Solution:
    def recoverTree(self, root: TreeNode) -> None:
        # 中序遍历函数,将节点按中序遍历顺序添加到列表中
        def inorder_traversal(node):
            if not node:
                return []
            return inorder_traversal(node.left) + [node] + inorder_traversal(node.right)
        # 中序遍历二叉搜索树,得到节点列表
        nodes = inorder_traversal(root)
        # 对节点列表按节点值进行排序
        sorted_nodes = sorted(nodes, key=lambda x: x.val)
        # 找到需要交换的两个错误节点
        p, q = None, None
        for i in range(len(nodes)):
            if nodes[i] != sorted_nodes[i]:
                if not p:#如果 p 还没有赋值
                    p = nodes[i]
                else:
                    q = nodes[i]
                    break
        # 交换 p 和 q 的值
        p.val, q.val = q.val, p.val
  • 更简洁的代码
class Solution:
    def recoverTree(self, root: TreeNode) -> None:
      #定义了一个匿名函数 Trees,该函数用于进行中序遍历。它通过递归地遍历左子树、根节点和右子树,并将节点依次添加到一个列表中。
        Trees = lambda x: [] if not x else Trees(x.left) + [x] + Trees(x.right)
        #得到了二叉搜索树中所有节点的列表 a,其中节点的顺序是中序遍历的顺序。
        a = Trees(root)
        sa = sorted(a, key=lambda x: x.val)#对列表排序
        p, q = [a[i] for i in range(len(a)) if a[i] != sa[i]]#通过遍历列表 a,找到在两个列表中不同的节点,分别赋值给 p 和 q。
        p.val, q.val = q.val, p.val#交换 p 和 q 的值

标签:pre,遍历,val,中序,二叉,99,搜索,nodes,节点
From: https://www.cnblogs.com/lushuang55/p/17881064.html

相关文章

  • 3999元 铭凡AR900i ITX主板上架:i9-13900HX+主动式散热器
    铭凡AR900iITX主板目前已上架开售,首发价3999元。据了解,这款主板搭载i9-13900HX处理器,24核32线程,睿频5.4GHz,拥有36MB三级缓存。拓展上,这款主板共有四个M.2SSD插槽,其中正面两个配有主动式散热器。显卡插槽为PCIe5.0标准,支持未来新一代显卡,内存支持两条DDR5-5600笔记本内存型......
  • 架构师的知行合一(内容由AI的全文生成,满分100分我打99分)
    大型架构是怎么来的随着科技的不断发展,越来越多的企业和组织开始意识到数字化转型的重要性。为了更好地适应市场的变化,满足客户的需求,提高企业的竞争力,大型架构成为了企业和组织不可或缺的一部分。那么,大型架构到底是怎么来的呢?本文将为您深入剖析。一、业务需求推动架构演进......
  • 全局平衡二叉树学习笔记 && [SDOI2017]切树游戏解题报告
    首先,任何一个卡树剖的出题人都很没有素质前言2023年8月22日,XDFnoip模拟赛场上,神犇liuhangxin自己发明了矩阵乘法维护FWT,可是出成绩的时候发现本题挂了30分。2023年9月22日,菜鸡cool_milo看到了liuhangxin的题解,但是由于太菜,并没有看懂。2023年10月22日,菜......
  • 『做题记录』P3599 Koishi Loves Construction
    P3599KoishiLovesConstructionDescription  给定一下两种询问:Task1:试判断能否构造并构造一个长度为\(n\)的\(1\dotsn\)的排列,满足其\(n\)个前缀和在模\(n\)的意义下互不相同。Task2:试判断能否构造并构造一个长度为\(n\)的\(1\dotsn\)的排列,满足其\(n\)......
  • 2.二叉树层序遍历
    107.二叉树的层序遍历II相对于102.二叉树的层序遍历,就是最后把result数组反转一下就可以了。classSolution{//利用链表可以进行o(1)头部插入publicLinkedList<List<Integer>>res=newLinkedList<List<Integer>>();publicList<List<Integer>>levelOrd......
  • 1.二叉树
    二叉树的种类满二叉树满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。完全二叉树完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边......
  • 第7章. 平衡二叉搜索树
    平衡二叉搜索树(BalancedBinarySearchTree)1.1二叉搜索树存在的问题添加、删除节点时,都可能导致二叉搜索树退化成链表。为了防止二叉搜索树退化成链表,让添加、删除搜索的复杂度维持在O(logn),提出平衡的概念。1.2平衡(Balance)平衡:当节点数量固定时,左右子树的高度越......
  • 第5章. 二叉树
    二叉树一、树的基本概念节点、根节点、父节点、子节点、兄弟节点一棵树可以没有任何节点,称为空树一棵树可以只有一个节点,也就是只有根节点子树、左子树、右子树节点的度:子树的个数树的度:所有节点度中的最大值叶子节点:度为0的节点非叶子节点:度不为0的节点层数:根节点......
  • 17_二叉树的所有路径
    二叉树的所有路径给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例1:输入:root=[1,2,3,null,5]输出:["1->2->5","1->3"]示例2:输入:root=[1]输出:["1"]【思路】题目要求从根节点到叶子的路径,所以需要......
  • java进行文件搜索的一个小案例
    分享一个小demo,可以查询某个文件目录下的某个文件并启动,来自黑马的IO教程importjava.io.File;importjava.io.IOException;publicclassApp3{publicstaticvoidmain(String[]args)throwsIOException{searchFile(newFile("D:/"),"pycharm64.exe");......