一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回。已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 head,返回一个长度为 2 的二叉树节点类型 的数组 errs,errs[0]表示一个错误节点,errs[1]表示另一个错误节点。

如果在原问题中得到了这两个错误节点,我们当然可以通过交换两个节点的节点 值的方式让整棵二叉树重新成为搜索二叉树。但现在要求你不能这么做,而是在 结构上完全交换两个节点的位置,请实现调整的函数。

public static class Node{public int value;public Node left;public Node right;public Node(int data){this.value = data;}
}public static Node[] getTwoErrNodes(Node head){Node[] errs = new Node[2];if(head == null){return errs;}Stack<Node> stack = new Stack<Node>();Node pre = null;while(!stack.isEmpty() || head != null){if(head != null){stack.push(head);head = head.left;}else{head = stack.pop();if(pre != null && pre.value > head.value){errs[0] = errs[0] == null ? pre : errs[0];errs[1] = head;}pre = head;head = haed.right;}}return errs;
}public static Node[] getTwoErrParents(Node head, Node e1, Node e2){Node[] parents = new Node[2];if(head == null){return parents;}Stack<Node> stack = new Stack<Node>();while(!stack.isEmpty() || head != null){if(head != null){stack.push(head);head = head.left;}else{head = stack.pop();if(head.left == e1 || head.right == e1){parents[0] = head;}if(head.left == e2 || head.right == e2){parents[1] = head;}head = head.right;}}return parents;
}public static Node recoverTree(Node head){Node[] errs = getTwoErrNodes(head);Node[] parents = getTwoErrParents(head, err[0], err[1]);Node e1 = errs[0];Node e1P = parents[0];Node e1L = e1.left;Node e1R = e1.right;Node e2 = errs[1];Node e2P = parents[1];Node e2L = e2.left;Node e2R = e2.right;if(e1 == head){if(e1 == e2P){e1.left = e2L;e1.right = e2R;e2.right = e1;e2.left = e1L;}else if(e2P.left == e2){e2P.left = e1;e2.left = e1L;e2.right = e1R;e1.left = e2L;e1.right = e2R;}else{e2P.right = e1;e2.left = e1L;e2.right = e1R;e1.left = e2L;e1.right = e2R;}head = e2;}else if(e2 == head){if(e2 == e1P){e2.left = e1L;e2.right = e1R;e1.left = e2;e1.right = e2R;}else if(e1P.left = e1){e1P.left = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;}else{e1P.right = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;}head = e1;}else{if(e1 == e2P){if(e1P.left == e1){e1P.left = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1;}else{e1P.right = e2;e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1;}}else if(e2 == e1P){if(e2P.left == e2){e2P.left = e1;e2.left = e1L;e2.right = e1R;e1.left = e2;e1.right = e2R;}else{e2P.right = e1;e2.left = e1L;e2.right = e1R;e1.left = e2;e1.right = e2R;}}else{if(e1P.left == e1){if(e2P.left == e2){e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;e1P.left = e2;e2P.left = e1;}else{e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R:e1P.left = e2;e2P.right = e1;}}else{if(e2P.left == e2){e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;e1P.right = e2;e2P.left = e1;}else{e1.left = e2L;e1.right = e2R;e2.left = e1L;e2.right = e1R;e1P.right = e2;e2P.right = e1;}}}}return head;
}public static void printTree(Node head){System.out.println("Binary Tree:");printInOrder(head, 0, "H", 17);System.out.println();
}

调整搜索二叉树中两个错误的节点相关推荐

  1. 左神算法:调整搜索二叉树中两个错误的节点(Java版)

    本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...

  2. 寻找搜索二叉树中两个错误的节点

    题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...

  3. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)

    这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...

  4. 二叉树中两节点之间最短路径

    折腾了一下午,在参考 liuyi1207164339帖子和 ethannnli的帖子的基础上搞定了这个问题.刚开始头真的大了,感觉有点超出能力范围了.分析了他们的思路,求解这个二叉树中两节点的最短路径 ...

  5. 求一颗二叉树中两个节点的最低公共父节点

    题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...

  6. 寻找二叉树中两个结点的最近公共祖先

    寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...

  7. 二叉树中两个结点的最远距离

    二叉树是我们熟悉的数据结构之一,它的面试题也有很多,今天我们就来看下二叉树中两个结点的最远距离. 分析: 第一步: 第二步: 在分析完之后,我们就可以写代码了 //方法一:求二叉树的左右子树的高度之和 ...

  8. 求二叉树中两个节点最远的距离

    一说到二叉树,就有很多题目,今天在编程之美中看到了二叉树中两个节点最远的距离.所以给想借机写一篇博客. 在开始之前,我们先想想,两个最常节点的最远距离是怎么样的? 情况一:最大距离可能一个在左子树,一 ...

  9. 微软算法100题11 求二叉树中两节点之间的最大距离

    第11 题 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相 ...

最新文章

  1. 查询时间范围_MySQL慢查询(中):正确处理姿势,你get到了吗?
  2. 十分钟学习自然语言处理概述
  3. 爬取古剑奇谭三官网的图片
  4. 【CyberSecurityLearning 41】Linux密码破解以及菜单加密
  5. Android - 网络基础
  6. Asp:Response对象
  7. Spring和JSF集成:异常处理
  8. 买彩票,也要了解一些数学知识
  9. 41 FI配置-财务会计-固定资产-组织结构-定义资产分类
  10. python dataframe转置_Dataframe数据的增删改查,对齐(相加),转置,按值(索引)排序
  11. 解决 Package test is missing dependencies for the following libraries: libcrypto.so.1.0.0
  12. 十堰市人民小学一年级在计算机学校,我上一年级啦!
  13. Dell Inspiron 6400上安装Fedora 5后使声卡义务正常的方法
  14. WPF开发为按钮提供添加,删除和重新排列ListBox内容的功能
  15. 个人作业-四则运算题目生成程序(基于控制台)
  16. Lua 笔记--表达式
  17. 理顺8个版本vue的区别
  18. Mac实用技巧(三)—— 四指新建桌面
  19. intel edison固件更新
  20. 《C Primer Plus》第五章-运算符 表达式和语句(笔记、复习题、编程题,副作用和序列点,升降级)

热门文章

  1. 华为鸿蒙系统英语报纸_华为操作系统“鸿蒙”的英文是什么?
  2. 洛谷P2312 解方程题解
  3. S.O.L.I.D.类设计原则
  4. Python学习 - 之 数据封装和私有属性
  5. iOS之一个iOS开发人员完整的学习路线
  6. 自动生成get,set方法
  7. Python Requests快速入门
  8. Stust2的拦截器的运行流程及使用方法、注意事项
  9. 多线程下使用Jedis
  10. dom4j通过xpath查询xml