题目描述

一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请按升序输出这两个错误节点的值。(每个节点的值各不相同)
示例1
输入
{1,2,3}
返回值
[1,2]

思路

中序遍历可以得到搜索二叉树的升序遍历结果,题目描述其中两个节点交换了位置,因此只需在中序遍历中找到异常数据即可。

  1. 中序遍历二叉树
  2. 从前面往后找,发现当前数比后一个数大,则是异常数据,放在结果集下标为1的位置
  3. 从后面往前找,发现当前数比前一个数小,则是异常数据,放在结果集下标为0的位置

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.*;

/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* }
*/

public class Solution {
/**
*
* @param root TreeNode类 the root
* @return int整型一维数组
*/
List<Integer> res = new ArrayList();
public int[] findError (TreeNode root) {
// write code here
int[] r = new int[2];
dfs(root);
for(int i = 0; i < res.size(); i++){
if(res.get(i) > res.get(i+1)){
r[1] = res.get(i);
break;
}
}
for(int j = res.size() - 1; j >= 0; j--){
if(res.get(j) < res.get(j-1)){
r[0] = res.get(j);
break;
}
}
return r;
}

public void dfs(TreeNode root){
if(root != null){
dfs(root.left);
res.add(root.val);
dfs(root.right);
}
}
}

评论