import java.util.Stack;
/**
* Created by lxw, liwei4939@126.com on 2017/10/29.
* 调整搜索二叉树中两个错误结点,找到这两个错误结点并在
* 结构上完全交换两个节点的位置
*/
public class TwoErrNode {
public class Node{
int value;
Node left;
Node right;
public Node(int data){
this.value = data;
}
}
//中序遍历找到错误结点,第一个错误结点为第一次降序时较大的结点
//第二个错误结点为最后一次降序时较小的结点
private Node[] GetTwoErrNode(Node head){
Node[] res = new Node[2];
if(head == null){
return res;
}
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){
res[0] = res[0] == null ? pre : res[0];
res[1] = head;
}
pre = head;
head = head.right;
}
}
return res;
}
//找到两个错误结点的各自父结点
public 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 Node recoverTree(Node head){
Node[] errs = GetTwoErrNode(head);
Node[] parents = GetTwoErrParents(head, errs[0], errs[1]);
Node e1 = errs[0];
Node e1P = parents[0];
Node e1L = e1.left;
Node e1R = e1.right;
Node e2 = errs[1];
Node e2P = errs[1];
Node e2L = e2.left;
Node e2R = e2.right;
if(e1 == head){
if(e1 == e2P){
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1;
} else if(e2P.left == e2){
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
e2P.left = e1;
} else {
e1.left = e2L;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
e2P.right = e1;
}
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(e1 == e1P.left){
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(e2 == e2P.left){
e2P.left = e1;
e1.left = e2;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
} else {
e2P.right = e1;
e1.left = e2;
e1.right = e2R;
e2.left = e1L;
e2.right = e1R;
}
} else {
if(e1 == e1P.left){
if(e2 == e2P.left){
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(e2 == e2P.left){
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;
}
}
调整搜索二叉树中两个错误结点
最新推荐文章于 2022-07-03 18:50:14 发布