核心的思路:
二叉搜索树中,中序遍历时,得到的是一个升序的结果。
结合题意,当存在两个错误的节点时,会存在一个序不一致的地方。
举例来说,假设正确的二叉搜索树的中序遍历是:
1,2,3,4,5
而一个存在错误的节点是
5,2,3,4,1
很明显,错误的地方是5和1,
观察可以发现 5 > 2 ,同时4 > 1
那么我们在中序遍历的时候,可以先保存一个pre,如果root->val < pre,则走到了一个错误的点,保存下来。
那么针对上面的例子,我们得到的保存结果就是 5 2 4 1,最终我们取头和尾得到:
5 1
题目要求我们升序输出,然后再颠倒下,得到:
1,5
class Solution {
public:
/**
*
* @param root TreeNode类 the root
* @return int整型vector
*/
void findError(vector<int>& result,int &pre,TreeNode* root){
if(root == NULL)
return;
findError(result,pre,root->left); //中序遍历,左子树
if(pre == INT_MIN)
pre = root->val; //第一个节点,保存下
if(root->val < pre){ //到达错误的节点了
result.push_back(pre);
result.push_back(root->val);
}
pre = root->val;
findError(result, pre, root->right); //中序遍历,右子树
}
vector<int> findError(TreeNode* root) {
vector<int> result;
int pre = INT_MIN;
findError(result,pre, root);
vector<int> res;
if(result.size() < 2)
return res;
else{
//取最终的结果
res.push_back(result[result.size()-1]);
res.push_back(result[0]);
return res;
}
}
};
京公网安备 11010502036488号