Recover Binary Search Tree

来源:互联网 发布:中国古典风格网站源码 编辑:程序博客网 时间:2024/05/21 06:55

首先,对BST中序遍历,得到的就是有序数列。 所以,交换BST中的两个节点,会相应导致中序遍历序列的两个节点位置的交换。

以例子说明: 对于序列1,2,3,4,5,6,7    交换两个数字有两种情况

1, 交换相邻的两个, 比如2,3.   会得到 1,3,2,4,5,6,7  , 会出现一个数的小于其前驱的情况, 那只需要把这个数和它的前驱交换即可;

2,交换非相邻的两个,比如2,6. 会得到1,6,3,4,5,2,7  ,会出现两个数字小于其前驱的情况,这个时候就需要交换第一个数的前驱和第二个数。


/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    vector<TreeNode*>v;    TreeNode *pre;    void check(TreeNode *root)    {        if(v.size() == 4) return;        if(root->left) check(root->left);        int key = root->val;                if(pre)        {            if(key < pre->val)            {                v.push_back(pre);                v.push_back(root);            }        }        pre = root;        if(root->right) check(root->right);    }    void recoverTree(TreeNode *root) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        if(root == NULL) return;        v.clear();        pre = NULL;        check(root);        swap(v[0]->val, v[v.size()-1]->val);    }};


原创粉丝点击