题解 | #找到搜索二叉树中两个错误的节点#
找到搜索二叉树中两个错误的节点
http://www.nowcoder.com/practice/4582efa5ffe949cc80c136eeb78795d6
C++ 中序遍历
因为是一颗搜索二叉树,所以使用中序遍历的话就是对这些数进行从小到大的遍历,其中发生错误的两个点就是一个大的数换到了前面,一个小的数换到了后面。
故而,要找出这两个数,思路就是先找到中序遍历中当前节点值小于前一个节点值的节点(类似线索二叉树),它的前一个节点值就是我们要找的换到前面的一个大的数。
然后就是在此之后找出小的那个数,显然就是找出此后的最小的值就行。
代码如下:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类 the root
* @return int整型vector
*/
vector<int> findError(TreeNode* root) {
// write code here
static vector<int> ret = {0,0};
static int idx = 1;
static TreeNode* preNode;
if(root == NULL){
return ret;
}
findError(root->left);
if(preNode == NULL){
preNode = root;
}
if(idx==1 && root->val<preNode->val){
ret[idx] = preNode->val;
idx--;
}
if(idx==0 && root->val<preNode->val){
ret[idx] = root->val;
}
preNode = root;
findError(root->right);
return ret;
}
};