39. Recover Binary Search Tree && Validate Binary Search Tree

Recover Binary Search Tree

OJ: https://oj.leetcode.com/problems/recover-binary-search-tree/

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?

思想: Morris traversal.

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
// morris traversal
/******************************************************************************************/
/* Inorder Traversal(should get ascending seq.):Analysis:
case A: If 2 near nodes swapped,then there will be just 1 Inversion Pair.
case B: If 2 nodes not near swapped,then there will be 2 Inversion Pairs.
Weather case A or case B, swap the max-value and the min-value of the Inversion Pair(s).*/
/*****************************************************************************************/
class Solution {
public:
    void recoverTree(TreeNode *root) {
        TreeNode *cur, *pre, *node1, *node2;  // node1, node2: Record 2 near nodes
        TreeNode *first, *second;  // Record 2 swapping nodes
        node1 = node2 = first = NULL;
        cur = root;
        while(cur) {
            if(cur->left == NULL) {
                if(node1 == NULL) node1 = cur;
                else if(node2 == NULL) node2 = cur;
                else { node1 = node2; node2 = cur;}
                cur = cur->right;
            } else {
                pre = cur->left;
                while(pre->right && pre->right != cur) pre = pre->right;
                if(pre->right == NULL) {
                    pre->right = cur;
                    cur = cur->left;
                    continue;
                } else {
                    pre->right = NULL;
                    if(node2 == NULL) node2 = cur;
                    else {node1 = node2; node2 = cur;}
                    cur = cur->right;
                }
            }
            if(node1 && node2 && node1->val > node2->val) {
                if(first == NULL)  first = node1;
                second = node2;
            }
        }
        // already learn that there exist 2 nodes swapped.
        int t = first->val;
        first->val = second->val;
        second->val = t;
    }
};

Validate Binary Search Tree

OJ: https://oj.leetcode.com/problems/validate-binary-search-tree/

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Thoughts: As I posted on the discuss forum of Leedcode.

Solution 1 : Preorder traversal

class Solution {
public:
bool isValidBST(TreeNode *root) {
    if(root == NULL) return true;
    TreeNode *pre = NULL, *post = NULL;
    if(root->left) {
        pre = root->left;
        while(pre->right) pre = pre->right;
        if(pre->val >= root->val) return false;
    }
    if(root->right) {
        post = root->right;
        while(post->left) post = post->left;
        if(post->val <= root->val) return false;
    }
    return isValidBST(root->left) && isValidBST(root->right);
}
};

 Solution 2: Inorder traversal.

bool isBST(TreeNode *root, int& preV) {
     if(root == NULL) return true;
     bool l = isBST(root->left, preV);
     if(preV != INT_MIN && preV >= root->val) return false;
     preV = root->val;
     bool r = isBST(root->right, preV);
     return l && r;
}
class Solution {
public:
   bool isValidBST(TreeNode *root) {
       int preV = INT_MIN;  // There exists an Assert.  
       return isBST(root, preV);
   }
};

 Solution 3: Morris Traversal.

class Solution {
public:
    void recoverTree(TreeNode *root) {
        TreeNode *cur, *tem, *node1, *node2;
        TreeNode *first, *second;
        node1 = node2 = first = NULL;
        cur = root;
        while(cur) {
            if(cur->left == NULL) {
                if(node1 == NULL) node1 = cur;
                else if(node2 == NULL) node2 = cur;
                else { node1 = node2; node2 = cur;}
                cur = cur->right;
            } else {
                tem = cur->left;
                while(tem->right && tem->right != cur) tem = tem->right;
                if(tem->right == NULL) {
                    tem->right = cur;
                    cur = cur->left;
                    continue;
                } else {
                    tem->right = NULL;
                    if(node2 == NULL) node2 = cur;
                    else {node1 = node2; node2 = cur;}
                    cur = cur->right;
                }
            }
            if(node1 && node2 && node1->val > node2->val) {
        
                if(first == NULL)  first = node1;
                second = node2;
            }
        }
        int t = first->val;
        first->val = second->val;
        second->val = t;
    }
};
原文地址:https://www.cnblogs.com/liyangguang1988/p/3940150.html