找到搜索二叉树中的错误结点
找到搜索二叉树中的错误结点
问题重述:
一个二叉搜索树,其中的两个结点位置发生了互换,先给出二叉树的根节点,要求得到两个错误的结点
问题分析:
因为二叉搜索树的结构满足,当前节点大于左子节点小于右子结点,使用中序遍历的时候,得到的值是升序的,二叉树中的两个结点换了位置,那么一定会导致中序遍历得到的值不能够升序,那么根据这个我们就可以找到对应的错误结点。
有两种情况:一种是相邻节点位置互换,那么中序遍历结果中第一次出现乱序的结点和之后的结点就是位置错误的结点,第二种情况是不相邻的结点位置互换,那么中序遍历结果中会有两次乱序,错误的结点是第一次的最大值和第二次的最小值
解法:
遍历二叉树
解题:
代码:
public TreeNode[] getErrorNode(TreeNode root){
TreeNode[] res = new TreeNode[2];
if(root == null){
return res;
}
// 创建一个栈用于保存上一次的结点
Stack<TreeNode> stack = new Stack<TreeNode>();
// 保存上一次经过的结点
TreeNode pre = null;
// 开始循环,循环条件是栈不为null或者结点不为null
while(!staxk.isEmpty() || root != null){
// 不为null,则向当前结点的左子树进发
if(root != null){
stack.push(root);
root = root.left;
}else{
// 当前节点为null,返回上一次遍历的结点
root = stack.pop();
if(pre != null && pre.value > root.value){
// 因为是中序遍历,搜索二叉树的顺序应该是升序的,这里上一个结点大于当前结点,那么这个结点一定是错误节点
// 如果是相邻的结点错位,那么错误结点就是当前节点和当前节点的前一个结点,如果是不相邻的结点错位,那么错误的结点是第一次乱序的较大结点和第二次乱序的较小结点
res[0] = res[0] == null ? pre : res[0];
res[1] = root;
}
pre = root;
root = root.right;
}
}
return res;
}