[Swift]LeetCode99. 恢复二叉搜索树 | Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Example 1:

Input: [1,3,null,null,2]

   1
  /
 3
     2

Output: [3,1,null,null,2]

   3
  /
 1
     2

Example 2:

Input: [3,1,4,null,null,2]

  3
 / 1   4
   /
  2

Output: [2,1,4,null,null,3]

  2
 / 1   4
   /
  3

Follow up:

  • A solution using O(n) space is pretty straight forward.
  • Could you devise a constant space solution?


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

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

示例 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) 空间复杂度的解法很容易实现。
  • 你能想出一个只使用常数空间的解决方案吗?


68ms

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     public var val: Int
 5  *     public var left: TreeNode?
 6  *     public var right: TreeNode?
 7  *     public init(_ val: Int) {
 8  *         self.val = val
 9  *         self.left = nil
10  *         self.right = nil
11  *     }
12  * }
13  */
14 class Solution {
15     var biggerNode: TreeNode? = nil
16     var smallerNode: TreeNode? = nil
17     var node = TreeNode(-10000)
18
19     func inorderTraverse(_ root: TreeNode) {
20
21         if root.left != nil {
22             inorderTraverse(root.left!)
23         }
24
25         if biggerNode == nil && root.val <= node.val {
26             biggerNode = node
27         }
28         if root.val <= node.val {
29             smallerNode = root
30         }
31         node = root
32
33         if root.right != nil {
34             inorderTraverse(root.right!)
35         }
36
37     }
38     func recoverTree(_ root: TreeNode?) {
39         guard let root = root else { return }
40         inorderTraverse(root)
41         let num = smallerNode!.val
42         smallerNode?.val = (biggerNode?.val)!
43         biggerNode?.val = num
44     }
45 }


88ms

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     public var val: Int
 5  *     public var left: TreeNode?
 6  *     public var right: TreeNode?
 7  *     public init(_ val: Int) {
 8  *         self.val = val
 9  *         self.left = nil
10  *         self.right = nil
11  *     }
12  * }
13  */
14 class Solution {
15     func recoverTree(_ root: TreeNode?) {
16         var firstElement: TreeNode? = nil
17         var secondElement: TreeNode? = nil
18         var prevElement = TreeNode(Int.min)
19
20         traverse(root, &firstElement, &secondElement, &prevElement)
21
22         let temp = firstElement?.val
23         firstElement?.val = secondElement?.val ?? 0
24         secondElement?.val = temp ?? 0
25     }
26
27     fileprivate func traverse(_ root: TreeNode?, _ firstElement: inout TreeNode?, _ secondElement: inout TreeNode?, _ prevElement: inout TreeNode) {
28         guard let root = root else { return }
29
30         traverse(root.left, &firstElement, &secondElement, &prevElement)
31
32         if firstElement == nil && prevElement.val >= root.val {
33             firstElement = prevElement
34         }
35         if firstElement != nil && prevElement.val >= root.val {
36             secondElement = root
37         }
38         prevElement = root
39
40         traverse(root.right, &firstElement, &secondElement, &prevElement)
41     }
42 }


100ms

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     public var val: Int
 5  *     public var left: TreeNode?
 6  *     public var right: TreeNode?
 7  *     public init(_ val: Int) {
 8  *         self.val = val
 9  *         self.left = nil
10  *         self.right = nil
11  *     }
12  * }
13  */
14 class Solution {
15     var first: TreeNode?
16     var second: TreeNode?
17     var prev = TreeNode(Int.min)
18
19     func recoverTree(_ root: TreeNode?) {
20         traverse(root)
21
22         let temp = first!.val
23         first!.val = second!.val
24         second!.val = temp
25     }
26
27     func traverse(_ root: TreeNode?) {
28         if root == nil {
29             return
30         }
31
32         traverse(root?.left)
33
34         if first == nil && prev.val >= root!.val {
35             first = prev
36         }
37
38         if first != nil && prev.val >= root!.val {
39             second = root
40         }
41         prev = root!
42
43         traverse(root?.right)
44     }
45 }


128ms

 1 /**
 2  * Definition for a binary tree node.
 3  * public class TreeNode {
 4  *     public var val: Int
 5  *     public var left: TreeNode?
 6  *     public var right: TreeNode?
 7  *     public init(_ val: Int) {
 8  *         self.val = val
 9  *         self.left = nil
10  *         self.right = nil
11  *     }
12  * }
13  */
14 class Solution {
15     func recoverTree(_ root: TreeNode?) {
16         guard root != nil else {
17             return
18         }
19
20         var root = root
21
22         var firstNode: TreeNode?
23         var secondNode: TreeNode?
24         var preNode: TreeNode?
25
26         while root != nil {
27             if root!.left != nil {
28                 var pre = root!.left
29                 while pre!.right != nil && root! !== pre!.right! {
30                     pre = pre!.right
31                 }
32
33                 if pre!.right != nil && root === pre!.right! {
34                     if preNode != nil && preNode!.val >= root!.val {
35                         if firstNode == nil {
36                             firstNode = preNode
37                         }
38                         secondNode = root
39                     }
40                     preNode = root
41
42                     root = root!.right
43                     pre!.right = nil
44                 } else {
45                     pre!.right = root
46                     root = root!.left
47                 }
48
49             } else {
50
51                 if preNode != nil && preNode!.val >= root!.val {
52                     if firstNode == nil {
53                         firstNode = preNode
54                     }
55                     secondNode = root
56                 }
57                 preNode = root
58
59                 root = root!.right
60             }
61         }
62
63         if firstNode != nil && secondNode != nil {
64             let temp = firstNode!.val
65             firstNode!.val = secondNode!.val
66             secondNode!.val = temp
67         }
68     }
69 }

原文地址:https://www.cnblogs.com/strengthen/p/9937254.html

时间: 2024-10-13 16:01:00

[Swift]LeetCode99. 恢复二叉搜索树 | Recover Binary Search Tree的相关文章

【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)

一.   二叉搜索树(Binary SearchTree,BST) 对应<算法导论>第12章.相比一般二叉树,BST满足唯一的条件:任意节点的key>左孩子的key,同时<右孩子的key. 1.     节点类: public class BinarySearchTreesNode<T> { private int key; private T satelliteData; private BinarySearchTreesNode<T> parent, l

原生JS实现二叉搜索树(Binary Search Tree)

1.简述 二叉搜索树树(Binary Search Tree),它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 它的左.右子树也分别为二叉排序树. 2.代码说明 首先先创建一个辅助节点类Node,它初始化了三个属性:节点值,左孩子,有孩子. class Node { constructor(value) { this.value = value; this.left =

【数据结构05】红-黑树基础----二叉搜索树(Binary Search Tree)

目录 1.二分法引言 2.二叉搜索树定义 3.二叉搜索树的CRUD 4.二叉搜索树的两种极端情况 5.二叉搜索树总结 前言 在[算法04]树与二叉树中,已经介绍过了关于树的一些基本概念以及二叉树的前中后序遍历,而这篇文章将是在二叉树的基础上来展开讲解的二叉搜索树,也就是说二叉搜索树建立在树的基础之上.至于博主为何要花一整篇文章来讲这个二叉搜索树呢?原因很简单,红-黑树是基于二叉搜索树的,如果对二叉搜索树不了解,那还谈何红-黑树?红-黑树的重要性我想各位没吃过佩奇肉也肯定看过宜春跑....是的,j

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

二叉搜索树(Binary Search Tree)--C语言描述(转)

图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩子(当然了,存在的话)的值总是小于本身,而右孩子(存在的话)的值总是大于本身. 下面来介绍在此种二叉树结构上的查找,插入,删除算法思路. 查找:因为这种结构就是为了来方便查找的,所以查找其中的某个值很容易,从根开始,小的往左找,大的往右找,不大不小的就是这个节点了: 代码很简单,这里就不写了. 插入:插入一样的道理,从根开始,小的往左,大的往右,直到叶子,就插入.

二叉搜索树(Binary Search Tree)--C语言描述

一:硬着头皮就是上 数据结构中有个东西一直不愿意去面对,就是二叉搜索树,以及平衡二叉树.想想就耗脑细胞 马上开学了,就要学C++了,还有其他的事,估计更没有时间搞数据结构了,于是狠下心,把二叉搜索树和平衡二叉树给拿下!! 啊啊啊啊,算法很枯燥无聊,不过搞明白了收获多多,不过目前好像没有什么用. 反正安慰自己,这都是内功,修炼好了,以后放大招威力无比啊,嘿嘿. 二:图解二叉搜索树概念 二叉树呢,其实就是链表的一个二维形式,而二叉搜索树,就是一种特殊的二叉树,这种二叉树有个特点:对任意节点而言,左孩

[LeetCode] 99. Recover Binary Search Tree 复原二叉搜索树

Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. Example 1: Input: [1,3,null,null,2]   1   /  3     2 Output: [3,1,null,null,2]   3   /  1     2 Example 2: Input: [3,1,4,null,null,2]

Leetcode 99.恢复二叉搜索树

恢复二叉搜索树 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 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) 空间复杂度的解法很容易实现. 你能想出一个只使用常数空间的解决方案吗? 中序遍

【LeetCode 99】Recover Binary Search Tree

Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing its structure. 题意: 一颗二叉搜索树中有2个结点的元素被误换了,要求恢复二叉搜索树的原状. 思路: 中序遍历BST,若发现一次逆序,说明是两个相连结点的误换,直接交换结点的值:若发现两次逆序,则为不相连的两个结点误换,交换错误的结点即可.用一个变量保存先前结点的状态,若发生逆序则记