持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情
题目
给你二叉搜索树的根节点 root ,该树中的两个节点被错误地交换。请在不改变其结构的情况下,恢复这棵树。
示例1:
输入:root = [1,3,null,null,2]
输出:[3,1,null,null,2]
解释:3 不能是 1 左孩子,因为 3 > 1 。交换 1 和 3 使二叉搜索树有效。
示例2:
输入:root = [3,1,4,null,null,2]
输出:[2,1,4,null,null,3]
解释:2 不能在 3 的右子树中,因为 2 < 3 。交换 2 和 3 使二叉搜索树有效。
解决思路
根据题意可知,是二叉搜索树,这就是意味着节点之间是有顺序关系的。 如果我们把整棵树都 遍历 一遍,将遍历的结果保存下来,比如放到一个数组中。 那么这个数组应该是有序的。
既然是有序的那就好办了,我们将这个有序的数组遍历一遍。 如果数组是完全有序的,那么直接返回就可以了。 否则,我们找到顺序不一致的两个下标i和j,将arr[i].val和arr[j].val的值互换一下即可。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<TreeNode> list;
public void recoverTree(TreeNode root) {
list = new ArrayList();
inOrder(root);
TreeNode x = null;
TreeNode y = null;
for (int i = 0; i < list.size() - 1; i++) {
if (list.get(i).val > list.get(i+1).val){
y = list.get(i+1);
if (x == null) {
x = list.get(i);
}
}
}
if (x != null && y != null) {
int tmp = x.val;
x.val = y.val;
y.val = tmp;
}
}
public void inOrder(TreeNode root) {
if (root == null) return;
inOrder(root.left);
list.add(root);
inOrder(root.right);
}
}
最后
复杂度分析:
-
时间复杂度:O(N),其中 N 为二叉搜索树的节点数。中序遍历需要 O(N) 的时间,判断两个交换节点在最好的情况下是 O(1),在最坏的情况下是 O(N),因此总时间复杂度为 O(N)。
-
空间复杂度:O(N)。我们需要用 数组存储树的中序遍历列表
我是杰少,如果您觉的我写的不错,那请给我 点赞+评论+收藏 后再走哦!
往期文章:
- 使用 Google Breakpad 来助力解决程序崩溃
- UE4 多人游戏服务器探索
- 使用虚幻引擎自动化工具实现自动化部署
- 如何在 UE4 中制作一扇自动开启的大门
- 如何在 UE4 中用代码去控制角色移动
- 如何给 UE4 场景添加游戏角色
- UE4:Android 平台开发实践指南
- UE4 开发避坑指南(持续更新)
- 新年开工啦,放个小烟花庆祝一下
- 聊聊与苹果审核员的爱恨情仇(下)
- 聊聊与苹果审核员的爱恨情仇(上)
- 一名普通工具人的 2021 | 2021年终总结
- 二叉树刷题总结:二叉搜索树的属性
- 二叉树总结:二叉树的属性
- 二叉树总结:二叉树的修改与构造
- StoreKit2 有这么香?嗯,我试过了,真香
- 看完这篇文章,再也不怕面试官问我如何构造二叉树啦!
- 那帮做游戏的又想让大家氪金,太坏了!
- 手把手带你撸一个网易云音乐首页 | 适配篇
- 手把手带你撸一个网易云音乐首页(三)
- 手把手带你撸一个网易云音乐首页(二)
- 手把手带你撸一个网易云音乐首页(一)
- 代码要写注释吗?写你就输了
- Codable发布这么久我就不学,摸鱼爽歪歪,哎~就是玩儿
- iOS 优雅的处理网络数据,你真的会吗?不如看看这篇
- UICollectionView 自定义布局!看这篇就够了
请你喝杯 ☕️ 点赞 + 关注哦~
- 阅读完记得给我点个赞哦,有👍 有动力
- 关注公众号--- HelloWorld杰少,第一时间推送新姿势
最后,创作不易,如果对大家有所帮助,希望大家点赞支持,有什么问题也可以在评论区里讨论😄~**