Recover Binary Search Tree

Q:

A:

mirrors中序遍历,发生错误的节点保存,最后交换,主要分两种情况,错误的两个节点相邻或者不相邻。还是有点烦躁的。

class Solution {
 public:
  void recoverTree(TreeNode *root) {
      // Start typing your C/C++ solution below
      // DO NOT write int main() function
    TreeNode* pre = NULL;
    TreeNode* cur = root;
    TreeNode* wrong_node1 = NULL;
    TreeNode* wrong_node2 = NULL;
    while (cur) {
      if (!cur->left) {
        if (pre && cur->val < pre->val) {
          if (!wrong_node1) {
            wrong_node1 = pre;
            wrong_node2 = cur;
          } else {
            wrong_node2 = cur;
          }
        }
        pre = cur;
        cur = cur->right;
      } else {
        TreeNode* tmp_node = cur->left;
        bool recovered = false;
        while (tmp_node->right) {
          if (tmp_node->right == cur) {
            tmp_node->right = NULL;
            recovered = true;
            if (cur->val < pre->val) {
              if (!wrong_node1) {
                wrong_node1 = pre;
                wrong_node2 = cur;
              } else {
                wrong_node2 = cur;
              }
            }
            pre = cur;
            cur = cur->right;
            break;
          } else {
            tmp_node = tmp_node->right;
          }
        }
        if (!recovered) {
          tmp_node->right = cur;
          cur = cur->left;
        }
      }
    }
    if (!wrong_node1 || !wrong_node2) return;
    swap(wrong_node1->val, wrong_node2->val);
    return;
  }
};

 

posted @ 2013-07-08 21:05  dmthinker  阅读(102)  评论(0)    收藏  举报