恢复二叉搜索树

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

进阶:使用 O(n) 空间复杂度的解法很容易实现。你能想出一个只使用常数空间的解决方案吗?

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/recover-binary-search-tree/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:递归法
  • 首先,通过中序遍历得到二叉搜索树的所有节点allNodes,正常情况下,如果没有节点被错误的交换,allNodes所有节点应该是按升序排列,所以要找出被交换的2个节点;
  • 从后往前遍历allNodes,找到第一个值比前面的值小的节点,即为错误的第一个节点high;
  • high-1开始往前遍历allNodes,找到第一个值比high节点小的节点low,low+1位置的节点即为错误的第二个节点;
  • 交换low和high2个节点的值,即可恢复这棵树。
import java.util.ArrayList;
import java.util.List; public class LeetCode_099 {
public static void recoverTree(TreeNode root) {
List<TreeNode> allNodes = inOrder(root);
int high = -1, low = -1;
for (int i = allNodes.size() - 1; i >= 1; i--) {
// 找到上面的要交换的节点
if (allNodes.get(i).val < allNodes.get(i - 1).val) {
high = i;
break;
} } // 找到下面要交换的节点
for (low = high - 1; low >= 0; low--) {
if (allNodes.get(low).val < allNodes.get(high).val) {
break;
}
}
low++;
int temp = allNodes.get(low).val;
allNodes.get(low).val = allNodes.get(high).val;
allNodes.get(high).val = temp;
} /**
* 中序遍历
*
* @param root
* @return
*/
private static List<TreeNode> inOrder(TreeNode root) {
List<TreeNode> nodes = new ArrayList<>();
if (root != null) {
nodes.addAll(inOrder(root.left));
nodes.add(root);
nodes.addAll(inOrder(root.right));
}
return nodes;
} public static void main(String[] args) {
TreeNode root = new TreeNode(3);
root.left = new TreeNode(1);
root.right = new TreeNode(4);
root.right.left = new TreeNode(2); recoverTree(root);
System.out.println("恢复之前");
root.print();
System.out.println();
System.out.println("恢复之后");
root.print();
}
}

【每日寄语】 感谢不离不弃的你,让我知道仍有人爱我。感谢你的支持,不论今天有多挫折,我仍会勇敢地活下去。

最新文章

  1. POJ 1703 Find them, Catch them(带权并查集)
  2. Permutation
  3. sql-函数avg,count,max,min,sum
  4. json解析json字符串时候,数组必须对应jsonObjectArray,不能对应JsonObject。否则会解析错误。
  5. 同步灵无线锂电鼠G11-580HX独特“五灵键”
  6. asp.net 后台使用js弹窗失效问题
  7. js记录用户行为浏览记录和停留时间(转)
  8. IO流---字符流(FileWriter, FileReader ,BufferedWriter,BufferedReader)
  9. CSS3 background-size图片自适应
  10. Kubernetes代码解读-apiserver之list-watch
  11. IE不支持 Promise 解决办法
  12. 面向对象——类的内置attr(三十三)
  13. Day13作业及默写
  14. zzzp0371 属于本人
  15. jquery1.9 下检测浏览器类型和版本的方法
  16. 安装tensorflow出现问题的解法
  17. poj 2186 Popular Cows tarjan
  18. Unity2017烘焙参数设置
  19. brew 的 调度工具DBGPRINTF 和 c语言的 printf
  20. 表单(上)EasyUI Form 表单、EasyUI Validatebox 验证框、EasyUI Combobox 组合框、EasyUI Combo 组合、EasyUI Combotree 组合树

热门文章

  1. STC89C52引脚图(彩色)
  2. spring 整合shiro框架 模拟登录控制器。
  3. &lt;input type=&quot;file&quot;&gt; 标签详解
  4. Java线程池实现原理及其在美团业务中的实践(转)
  5. Redis 分布式锁使用不当,酿成一个重大事故,超卖了100瓶飞天茅台!!!(转)
  6. 【VUE】vue中遍历数组和对象
  7. getter/setter方法
  8. 关于final关键字
  9. mapTest
  10. Git重命名远程分支