1. 首页

LeetCode 099. 恢复二叉搜索树

题目描述:

难度:Hard

相关话题:深度优先搜索

二叉搜索树中的两个节点被错误地交换。

请在不改变其结构的情况下,恢复这棵树。

示例1:

输入: [1,3,null,null,2]

  1
 /
3
 \
  2

输出: [3,1,null,null,2]

  3
 /
1
 \
  2

示例2:

输入: [3,1,4,null,null,2]

  3
 / \
1   4
  /
 2

输出: [2,1,4,null,null,3]

  2
 / \
1   4
  /
 3

进阶:

  • 使用 O(n ) 空间复杂度的解法很容易实现。

  • 你能想出一个只使用常数空间的解决方案吗?


思路:

这道题关键就是利用二叉搜索树的中序遍历,找出不符合要求的2个节点。

其中O(n)的思路是,使用一个数组保存中序遍历的结果,然后找出错误排序的2个节点,通过交换即可。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:前端中文网是以前端进阶资源教程分享为主的专业网站,包括:前端、大厂面试题、typescript教程、程序人生、React.js
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {void} Do not return anything, modify root in-place instead.
 */
var recoverTree = function(root) {
  let aux=[]
  function dfs(root){
    if(root.left)dfs(root.left)
    aux.push(root)
    if(root.right)dfs(root.right)
  }
  dfs(root)
  let s1,s2
  for(let i=0;i<aux.length-1;i++){
    if(aux[i].val>aux[i+1].val){
      if(s1==null)s1=aux[i]
      if(s1!=null)s2=aux[i+1]
    }
  }
  let t=s1.val
  s1.val=s2.val
  s2.val=t
};

O(1)的思路也差不多,不过不需要使用一个数组来保存,而是3个变量prevNode,s1,s2,其中s1s2为最终交换的节点。

prevNode为上一个节点,直接在原树上进行中序遍历,当发现顺序不对时,让s1=prevNode, s2=root,接着遍历,如果还存在顺序
不对,只需要更新s2即可。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {void} Do not return anything, modify root in-place instead.
 */
var recoverTree = function(root) {
  let s1=null,s2=null,prev=null
  function dfs(root){
    if(root.left)dfs(root.left)
    if(prev && root.val<=prev.val){
      if(!s1)s1=prev
      if(s1)s2=root
    }
    prev=root
    if(root.right)dfs(root.right)
  }
  dfs(root)
  let t=s1.val
  s1.val=s2.val
  s2.val=t
};

更多题解可以访问我的 码农周刊 仓库:https://github.com/meibin08/free-programming-books, 一起学习更多前端前沿知识。

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

标题:LeetCode 099. 恢复二叉搜索树

链接:https://www.javascriptc.com/4459.html

« Js中文网周刊第102期
LeetCode 098. 验证二叉搜索树»
Flutter 中文教程资源

相关推荐

QR code