99. Recover Binary Search Tree

Posted ruruozhenhao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了99. Recover Binary Search Tree相关的知识,希望对你有一定的参考价值。

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

Recover the tree without changing its structure.

Example 1:

Input: [1,3,null,null,2]

   1
  /
 3
     2

Output: [3,1,null,null,2]

   3
  /
 1
     2

Example 2:

Input: [3,1,4,null,null,2]

  3
 / 1   4
   /
  2

Output: [2,1,4,null,null,3]

  2
 / 1   4
   /
  3

Follow up:

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

Approach #1: C++.[Recursive]

/**
 * 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 == NULL) return;
        helper(root);
        int temp = first->val;
        first->val = second->val;
        second->val = temp;
    }
private:
    TreeNode* first = NULL;
    TreeNode* second = NULL;
    TreeNode* prev = NULL;
    
    void helper(TreeNode* root) {
        if (root == NULL) return;
        helper(root->left);
        if (prev != NULL && prev->val > root->val) {
            if (first == NULL) first = prev;
            second = root;
        }
        prev = root;
        helper(root->right);
    }

};

  

Approach #2: Java.[Iterator]

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public void recoverTree(TreeNode root) {
        if (root == null) return;
        TreeNode first = null;
        TreeNode second = null;
        TreeNode prev = null;
        
        Stack<TreeNode> stack = new Stack<>();
        TreeNode curr = root;
        
        while (!stack.isEmpty() || curr != null) {
            if (curr != null) {
                stack.push(curr);
                curr = curr.left;
            } else {
                curr = stack.pop();
                if (prev != null && prev.val > curr.val) {
                    if (first == null) first = prev;
                    second = curr;
                }
                prev = curr;
                curr = curr.right;
            }
        }
        
        int temp = first.val;
        first.val = second.val;
        second.val = temp;
    }
}

  

Approach #3: Python. [Recursive]

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
        
    def recoverTree(self, root):
        """
        :type root: TreeNode
        :rtype: void Do not return anything, modify root in-place instead.
        """
        self.first = None
        self.second = None
        self.prev = None
        
        if root == None:
            return;
        
        self.helper(root);
        
        temp = self.first.val
        self.first.val = self.second.val
        self.second.val = temp
        
        
    def helper(self, root):
        if root == None:
            return;
        self.helper(root.left)
        
        if self.prev != None and self.prev.val > root.val:
            if self.first == None:
                self.first = self.prev
            self.second = root
        
        self.prev = root
        
        self.helper(root.right)

  

 

以上是关于99. Recover Binary Search Tree的主要内容,如果未能解决你的问题,请参考以下文章

99. Recover Binary Search Tree

LeetCode99 Recover Binary Search Tree

99. Recover Binary Search Tree

Leetcode 99. Recover Binary Search Tree

Leetcode 99. Recover Binary Search Tree

LeetCode OJ 99. Recover Binary Search Tree