题解 | #找到搜索二叉树中两个错误的节点#
找到搜索二叉树中两个错误的节点
http://www.nowcoder.com/practice/4582efa5ffe949cc80c136eeb78795d6
核心的思路:
二叉搜索树中,中序遍历时,得到的是一个升序的结果。
结合题意,当存在两个错误的节点时,会存在一个序不一致的地方。
举例来说,假设正确的二叉搜索树的中序遍历是:
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; } } };