***(leetcode) Recover Binary Search Tree

来源:互联网 发布:淘宝怎么看天猫积分 编辑:程序博客网 时间:2024/06/07 19:43

Two elements of a binary search tree (BST) are swapped by mistake.

Recover the tree without changing its structure.

Note:
A solution using O(n) space is pretty straight forward. Could you devise a constant space solution?

confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.

1、空间复杂度是O(n) ,先中序遍历,根据中序遍历结果是升序,然后用插入排序对中序遍历节点的值排序

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {    void scan(TreeNode *root, vector<TreeNode *> &v){        if(NULL == root)            return ;        scan(root->left, v);        v.push_back(root);        scan(root->right, v);    }    public:    void recoverTree(TreeNode *root) {        vector<TreeNode *> v, recover;                scan(root,v);                int i , j, tmp;        for(i=0;i<v.size()-1;i++) //基本有序,so用插入排序效率最高               for(j=i+1;j>0;j--)                if(v[j]->val<v[j-1]->val){                    tmp = v[j]->val;                    v[j]->val = v[j-1]->val;                    v[j-1]->val = tmp;                }    }};


2、 空间复杂度是常数,在中序遍历的时候,用pre表示当前节点的前一个节点,如果当前节点的值小于前面的值,则表示出错。 用mistake1 , mistake2表示出错的两个节点,如果两个节点不挨着,则第一个是pre节点放到mistake1, 第二处是root放到mistake2中。 注意如果遍历中只有一处不正常,则说明两个节点是挨着的,分别是pre 和root


/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {        TreeNode *mistake1, *mistake2;    TreeNode *pre;        void scan(TreeNode *root){        if(NULL == root)            return ;        scan(root->left);        if(NULL!=pre && root->val < pre->val){            if(NULL == mistake1){                mistake1 = pre;                mistake2 = root;            }else                mistake2 = root;        }        pre = root;        scan(root->right);    }    public:    void recoverTree(TreeNode *root) {        //pre=NULL; //可以不用初始化,但是要确保pre是NULL,进入递归        scan(root);                int tmp = mistake1->val;        mistake1->val = mistake2->val;        mistake2->val = tmp;           }};


0 0
原创粉丝点击