题目
给定一棵搜索二叉树,将其中的某两个节点颠倒,求出被颠倒的结点
分析
根据搜索二叉树的性质可知
1、搜索二叉树进行中序遍历,依次出现的节点值会一直升序,如果出现降序,则有结点位置被置换了;
2、如果在中序遍历时结点值出现了两次降序,第一个错误结点为第一次降序时较大的结点,第二个错误的结点为第二次降序时较小的结点;
3、如果在中序遍历时结点值只出现了一次降序,第一个错误的结点为这次降序时较大的结点,第二个错误的结点为这次降序时较小的结点。
代码实现
/**
* 一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,
* 使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。
* 给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。
*/
private class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
private int[] findError(TreeNode root) {
// write code here
int[] res = new int[2];
ArrayDeque<TreeNode> queue = new ArrayDeque();
TreeNode cur=root;
TreeNode point=null;//栈顶弹出的元素,是用来比较的第一个元素
while (!queue.isEmpty() || cur != null) {
if (cur != null) {
queue.addLast(cur);
cur = cur.left;
} else {
cur = queue.pollLast();
if (point != null && point.val > cur.val) {
res[1] = res[1] == 0 ? point.val : res[1];
res[0] = cur.val;
}
point = cur;
cur = cur.right;
}
}
return res;
}