题目描述
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请按升序输出这两个错误节点的值。(每个节点的值各不相同)
示例1
输入 {1,2,3}
返回值 [1,2]
思路:中序遍历二叉搜索树,遍历后正常的顺序应该是升序序列,但是由于两个节点交换了位置。因此两个节点所处的位置是不正确的,也就是相当于将数值大的节点与数值小的节点的位置相互交换,那么就会出现两次逆序的位置。此时,第一次逆序数值大的是错误节点,第二次逆序数值小的是错误的节点。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类 the root
* @return int整型vector
*/
vector<int> vec;
vector<int> findError(TreeNode* root) {
// write code here
vector<int> res(2);
inorder(root);
int time=0;
for(int i=0;i+1<vec.size();i++)
{
if(vec[i+1]<vec[i])
{
time++;
if(time==1) res[1]=vec[i];
else if(time==2)
{
res[0]=vec[i+1];
break;
}
}
}
return res;
}
void inorder(TreeNode* cur)
{
if (cur == NULL) return;
inorder(cur->left); // 左
vec.push_back(cur->val); // 中
inorder(cur->right); // 右
}
};