您的位置:首页 > 其它

【刷题之路】寻找错误结点

2016-05-31 21:28 190 查看
一棵二叉树原本是搜索二叉树,但是其中有两个节点调换了位置,使得这棵二叉树不再是搜索二叉树,请找到这两个错误节点并返回他们的值。保证二叉树中结点的值各不相同。

给定一棵树的根结点,请返回两个调换了位置的值,其中小的值在前。

二叉搜索树按照中序遍历应该是一个升序数组,如果有错位节点,包括两种情况

情况1:1 5 3 4 2 ,其中共有两次降序数字对,分别为5 3与4 2,只要取第一对的较大数字与第二对的较小数字即可

情况2:1 2 4 3 5,其中只有一对降序数字,则直接返回即可。

class FindErrorNode {

public:

    vector<int> findError(TreeNode* root) {

        // write code here

        vector<int> temp;

        vector<int> res;

        midtree(root,temp);

        int p1,p2;

        int i,j;

        for(i=0;i<temp.size()-1;i++){   

            if(temp[i]>temp[i+1]){ //出现第一对降序数字对,存下来

                p1=temp[i];

                p2=temp[i+1];

                for(j=i+1;j<temp.size()-1;j++){  //在之后寻找第二对降序数字对,更新第二个数为第二对中较小的数字

                    if(temp[j]>temp[j+1]){

                        p2=temp[j+1];

                    }

                }

                break; //跳出循环

            }

        }

        res.push_back(p2); //p2小于p1

        res.push_back(p1);

        return res;

    }

    void midtree(TreeNode* root,vector<int> &res){  //递归法中序遍历二叉树

        if(root==NULL) return;

        midtree(root->left,res);

        res.push_back(root->val);

        midtree(root->right,res);

    }

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  刷题 二叉树 搜索