【LeetCode练习题】Recover Binary Search Tree

Recover Binary Search Tree

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

Recover the tree without changing its structure.

 

互换二叉搜索树中两个位置错误的节点。

 

思路:

预设三个指针pre,p1,p2。p1用来指向第一个出错的节点,p2用来指向第二个出错的节点。

出错情况有两种,即p1和p2相邻,p1和p2不相邻。

中序遍历此二叉树,用pre指向当前节点的上一个节点,如果出错的节点相邻,此时p1应该指向pre,p2应该指向当前节点root。

若出错节点不相邻,则用p1记录第一个出错节点pre,继续遍历到前一个节点pre大于当前节点root时,用p2指向第二个出错节点p2.

 

代码如下:

class Solution {
public:
    TreeNode *pre,*p1,*p2;

    void run(TreeNode *root){
        if(!root) 
            return;
        run(root->left);
        if(pre && pre->val > root->val){
            if(p1 == NULL){
                p1 = pre; p2 = root;
            }
            else{
                p2 = root;
            }
        }
        pre = root;
        run(root->right);
    }

    void recoverTree(TreeNode *root) {
        if(!root)
            return ;
        pre = p1 = p2 = NULL;
        run(root);
        swap(p1->val,p2->val);
    }
};

 

posted on 2014-04-24 15:41  Allen Blue  阅读(514)  评论(0编辑  收藏  举报

导航