调整搜索二叉树中两个错误的节点
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回。已知二叉树中所有节点的 值都不一样,给定二叉树的头节点 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();
}
调整搜索二叉树中两个错误的节点相关推荐
- 左神算法:调整搜索二叉树中两个错误的节点(Java版)
本题来自左神<程序员代码面试指南>"调整搜索二叉树中两个错误的节点"题目. 题目 原问题: 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再 ...
- 寻找搜索二叉树中两个错误的节点
题目:一颗二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这颗二叉树不再是搜索二叉树,请找到两个错误节点并返回.已知二叉树中所有节点的值都不一样,给定二叉树的头节点head,返回一个长度为2 ...
- 程序员面试100题之十六:二叉树中两个节点的最近公共父节点(最低的二叉树共同祖先)
这个问题可以分为三种情况来考虑: 情况一:root未知,但是每个节点都有parent指针 此时可以分别从两个节点开始,沿着parent指针走向根节点,得到两个链表,然后求两个链表的第一个公共节点,这个 ...
- 二叉树中两节点之间最短路径
折腾了一下午,在参考 liuyi1207164339帖子和 ethannnli的帖子的基础上搞定了这个问题.刚开始头真的大了,感觉有点超出能力范围了.分析了他们的思路,求解这个二叉树中两节点的最短路径 ...
- 求一颗二叉树中两个节点的最低公共父节点
题目:求一棵二叉树中两个节点的最低公共父节点 思路:递归 和 非递归 public static TreeNode getLastCommonParentRec(TreeNode root, Tree ...
- 寻找二叉树中两个结点的最近公共祖先
寻找二叉树中两个结点的最近公共祖先(这两个结点一定在树中) 对于二叉树中两个结点的最近公共祖先来说 ,这两个结点分别在自己的左子树和右子树中,所以要寻找二叉树中两个结点的最近公共祖先可以: 从根结点开 ...
- 二叉树中两个结点的最远距离
二叉树是我们熟悉的数据结构之一,它的面试题也有很多,今天我们就来看下二叉树中两个结点的最远距离. 分析: 第一步: 第二步: 在分析完之后,我们就可以写代码了 //方法一:求二叉树的左右子树的高度之和 ...
- 求二叉树中两个节点最远的距离
一说到二叉树,就有很多题目,今天在编程之美中看到了二叉树中两个节点最远的距离.所以给想借机写一篇博客. 在开始之前,我们先想想,两个最常节点的最远距离是怎么样的? 情况一:最大距离可能一个在左子树,一 ...
- 微软算法100题11 求二叉树中两节点之间的最大距离
第11 题 求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相 ...
最新文章
- 查询时间范围_MySQL慢查询(中):正确处理姿势,你get到了吗?
- 十分钟学习自然语言处理概述
- 爬取古剑奇谭三官网的图片
- 【CyberSecurityLearning 41】Linux密码破解以及菜单加密
- Android - 网络基础
- Asp:Response对象
- Spring和JSF集成:异常处理
- 买彩票,也要了解一些数学知识
- 41 FI配置-财务会计-固定资产-组织结构-定义资产分类
- python dataframe转置_Dataframe数据的增删改查,对齐(相加),转置,按值(索引)排序
- 解决 Package test is missing dependencies for the following libraries: libcrypto.so.1.0.0
- 十堰市人民小学一年级在计算机学校,我上一年级啦!
- Dell Inspiron 6400上安装Fedora 5后使声卡义务正常的方法
- WPF开发为按钮提供添加,删除和重新排列ListBox内容的功能
- 个人作业-四则运算题目生成程序(基于控制台)
- Lua 笔记--表达式
- 理顺8个版本vue的区别
- Mac实用技巧(三)—— 四指新建桌面
- intel edison固件更新
- 《C Primer Plus》第五章-运算符 表达式和语句(笔记、复习题、编程题,副作用和序列点,升降级)