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

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

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

相关推荐

程序员牛肉:继续沉淀吧同学,你这就是纯纯的流水线产品。 差不多的学历+两个烂大街项目。自身学历又不行,现在找啥实习呢。有点太浮躁了。多花点心思搞搞ai,开源和八股。这比你这段时间捣鼓一段小厂实习要好得多;
点赞 评论 收藏
分享
11-29 00:55
门头沟学院
区域赛银,邀请赛金,打算十二月打下Java基础、背点八股、写个外卖后去投福建小厂的寒假实习,简历应该怎么写呢?以及福州/和厦门有推荐的小厂吗?
牛客53210502...:简历一页:把区域银,邀请赛金标粗,其他的奖除非凑一页否则没有必要写。或者多页:每个站一行这样都列出来。项目经历看看牛客其他人是怎么写的,写的不好呢。简历打磨好按部就班没问题的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务