题解 | #找到搜索二叉树中两个错误的节点#

找到搜索二叉树中两个错误的节点

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;
        }
    }
};
全部评论

相关推荐

11-08 10:39
门头沟学院 C++
点赞 评论 收藏
分享
像好涩一样好学:这公司我也拿过 基本明确周六加班 工资还凑活 另外下次镜头往上点儿
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务