题目描述
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请按升序输出这两个错误节点的值。(每个节点的值各不相同)
示例1
输入
{1,2,3}
返回值
[1,2]
思路
中序遍历可以得到搜索二叉树的升序遍历结果,题目描述其中两个节点交换了位置,因此只需在中序遍历中找到异常数据即可。
- 中序遍历二叉树
- 从前面往后找,发现当前数比后一个数大,则是异常数据,放在结果集下标为1的位置
- 从后面往前找,发现当前数比前一个数小,则是异常数据,放在结果集下标为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 Solution {
List<Integer> res = new ArrayList(); public int[] findError (TreeNode root) { 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); } } }
|