/**
* Definition for a binary tree node.
* public class TreeNode {
* public int val;
* public TreeNode left;
* public TreeNode right;
* public TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void RecoverTree(TreeNode root) {
if (root == null) {
return;
}
List<int> list = new List<int>();
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
// 中序遍历
while (stack.Count != 0 || node != null) {
while (node != null) {
stack.Push(node);
node = node.left;
}
node = stack.Pop();
list.Add(node.val);
node = node.right;
}
int index1 = -1, index2 = -1, value1 = -1, value2 = -1;
int preValue = list[0], value = -1;
// 查找出替换的索引即值
for (int i = 1; i < list.Count; i++) {
value = list[i];
if (preValue > value) {
if (index1 == -1) {
index1 = i - 1;
value1 = preValue;
// 替换的位置相邻
index2 = i;
value2 = value;
} else {
index2 = i;
value2 = value;
break;
}
}
preValue = value;
}
// 中序遍历修正
node = root;
int index = 0;
while (stack.Count != 0 || node != null) {
while (node != null) {
stack.Push(node);
node = node.left;
}
node = stack.Pop();
if (index == index1) {
node.val = value2;
} else if (index == index2) {
node.val = value1;
break;
}
node = node.right;
index++;
}
}
}