恢复二进制搜索树[Leetcode 99]

100 阅读4分钟

Leetcode问题, 树问题, 递归

照片:Johannes PlenioonUnsplash

这篇文章的目的是解决恢复二进制搜索树Leetcode 99问题

问题说明

给你一棵二进制搜索树(BST)的根,树上正好有两个节点的值被错误地交换了。在不改变树的结构的情况下恢复该树

来源 Leetcode

例子1

Input:

例子2

Input:

如果你正在为你的技术编码面试做准备,或者你想学习递归以提高你解决问题的能力,那么你一定要看看这个udemy课程 从初级到高级掌握递归技术

如果你想从初级到专家水平学习ARKit 3,请点击 这里获得该课程,你将获得97%的折扣。

如果你热衷于学习iOS的移动开发,并希望将你的iOS开发技能提高到一个新的水平,那么CloudKit框架的核心数据应该是你清单上的首要任务。点击 这里获取该课程,你将获得97%的折扣。

从零开始学习SwiftUI 点击 这里获取课程,因为在这个课程中,我们将使用SwiftUI建立许多应用程序,如Facebook克隆,新闻应用程序,笔记应用程序和更多。

蛮力的方法

首先,我们将创建一个向量,我们将以顺序方式遍历树(你可以使用任何遍历算法),我们将推回向量中的元素,然后我们将以升序排序向量。

之后,我们将再次遍历树,我们将用我们的向量值改变树的值,但这次我们必须按顺序遍历,因为二进制搜索树由小于左边节点的元素和大于右边节点的元素组成,按顺序遍历将给出元素的递增顺序。

蛮力方法的代码

class Solution {
vector<int> v;
void solve(TreeNode* root) {
int i = 0;

蛮力法的时间和空间复杂度

时间复杂度。O(n)

空间复杂度。O(n)

最优方法

在蛮力方法中,空间复杂度为O(n),我们必须做得更好,如果你认为问题中只有两个节点被交换,我们可以做的是,以In-Order方式遍历树,创建一个前一个节点,并将其值设置为空,然后我们将遍历树,比较当前节点的值和前一个节点的值,如果前一个节点不是空的,并且前一个节点的值大于当前节点的值,我们可以将前一个节点和当前节点推回我们的对矢量中,因为这就是被交换的那个节点。

我们的数组里有所有这样的节点对。数组大小将是1或2,不超过2,因为只有两个节点被交换。如果数组大小为1,意味着只有两个相邻的节点被交换,否则数组大小将是2。

因此,我们必须相应地交换数字以回到原始树。

最优方法的代码

class Solution {
TreeNode* prev = NULL;
void solve(TreeNode* root) {

最优方法的时间和空间复杂度

时间复杂度。O(n)

空间复杂度。O(1) // 我们不考虑堆栈空间。

结语

本篇文章到此结束。我希望你喜欢这篇文章,并且你已经学会了如何解决树形问题。

其他资源

如果你正在为你的技术编码面试做准备,或者你想学习递归以提高你的问题解决能力,那么你一定要看看这个udemy课程 从初级到高级掌握递归技术

如果你想从初级到专家级别学习ARKit 3,请点击 这里 获取该课程,你将获得97%的折扣。

如果你热衷于学习iOS的移动开发,并希望将你的iOS开发技能提高到一个新的水平,那么CloudKit框架下的核心数据应该是你的首要任务。点击 这里 获得该课程,你将获得97%的折扣。

从零开始学习SwiftUI 点击 这里 获取课程,因为在这个课程中,我们将使用SwiftUI建立许多应用程序,如Facebook克隆,新闻应用程序,笔记应用程序和更多。


恢复二进制搜索树[Leetcode 99]最初发表于Nerd For Techon Medium,在那里人们通过强调和回应这个故事继续对话。