码迷,mamicode.com
首页 > 其他好文 > 详细

【Recover Binary Search Tree】cpp

时间:2015-05-14 23:37:22      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

题目:

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.

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    void recoverTree(TreeNode* root) {
            if (!root) return;
            TreeNode *pre, *curr, *first=NULL, *second=NULL;
            stack<TreeNode *> sta;
            TreeNode *dummy = new TreeNode(INT_MIN);
            dummy->left = root;
            pre = dummy;
            curr = root;
            while ( !sta.empty() || curr )
            {
                if (curr){
                    sta.push(curr);
                    curr = curr->left;
                }
                else{
                    curr = sta.top();
                    sta.pop();
                    if ( !first ){
                        if ( pre->val > curr->val ){
                            first = pre;
                            second = curr;
                        }
                    }
                    else{
                        if ( curr->val < pre->val ){
                            second = curr;
                            break;
                        }
                    }
                    pre = curr;
                    curr = curr->right;
                }
            }
            std::swap(first->val, second->val);
    }
};

tips:

二叉查找树的中序遍历就是从小到大的输出(http://zh.wikipedia.org/wiki/二元搜尋樹)。

即从中序遍历的结果中找到两个需要交换的点。

为了简便,这里设定了虚根节点(初始化值为INT_MIN)保证不影响中序遍历的结果。具体的思想都参考的(http://www.cnblogs.com/TenosDoIt/p/3445682.html)。

通过这道题回顾了一下中序遍历的方法,并纠正了之前的中序遍历的一种自毁型的代码

http://www.cnblogs.com/xbf9xbf/p/4501655.html

在上面这道题中,写了一个自毁型的中序遍历代码(即中序遍历结束后,整个二叉树的所有节点都断了)。

在本道题中一开始沿用了这种自毁型的中序遍历代码,结果就可想而知了。通过这个点,给自己提个醒:以后再涉及到遍历这类的代码,尽量不要再写这种遍历一次就毁坏了数据结构的代码了。 

【Recover Binary Search Tree】cpp

标签:

原文地址:http://www.cnblogs.com/xbf9xbf/p/4504681.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!