zoukankan      html  css  js  c++  java
  • LeetCode_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?
    confused what "{1,#,2,3}" means? > read more on how binary tree is serialized on OJ.
    

      

    Solution and Precautions:

    The basic idea is to in-order traverse the whole tree and find the reversed pair and fix them. The following are based on the same in-order traverse but using different space.

    (1)  using average O(N) space. use perform regular in-order traverse on the whole tree and store all the node pointers in an allocated vector or array, find the reversed pair in the array, and swap the values pointed by the stored pointers. The allocated array cost O(N) space averagely

    (2) average O(log N) space but O(N) in worst case. Still do in-order traverse but without the the allocated array in (1), this could be down by keeping two pointers prev and current which point to the consecutive nodes in the in-order sequence, during one pass in-order traverse, we keep comparing them (pre->val, current->val) and we can get the first and second pointers to the swapped wrong nodes. After finishing the in-order traverse, you swap back the two wrong nodes. And we are down. Since we do recursive in-order traverse, we still allocate additional memory in the stack which is O(hight of the tree), so the space we use is actually  average O(log N) space but O(N) in worst case.

    (3) real constant space. In order to get constant space, we have to be able to do the in-order traverse without using the stack, then we might need to get the help of the “threaded binary tree”. By following the threaded binary tree, we make use of the NULL node of the leaf node by making the right NULL child of the leaf node point to the next node in the in-order sequence, we are able to do the in-order traverse without using stack and thus constant memory, combing (2) we only need another two pointers Prev, Curret, to keep traversing the while tree in in-order and another two Ptr1, Ptr2 to keep record of the reversed nodes. Then then finish swapping them. And all these are be achieved by using constant number of pointers. This is constant space solution.

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    void inOrder(TreeNode *root){
            if(root->left ) inOrder(root->left);
    		if(pre == NULL) pre = root;
    		  else  if(pre-> val > root->val ){
    			 if(first == NULL)
                     first = pre;
                  second = root;
    		  } 
        	 pre = root;
    		 if(root->right ) inOrder(root->right);	
    	}
        void recoverTree(TreeNode *root) {
            // Start typing your C/C++ solution below
            // DO NOT write int main() function
            if(root == NULL) return;
    		first = NULL;
    		second = NULL;
    		pre = NULL ;
    		inOrder(root);
            int temp = first->val ;
    		first->val = second->val;
    		second->val = temp;
        }
    private :
      TreeNode * first;
      TreeNode * second;
      TreeNode * pre;
    };
    

      reference :http://tech-wonderland.net/blog/leetcode-recover-binary-search-tree.html#comment-2742

  • 相关阅读:
    mysql 添加自增长ID(序列方式)
    获取本地IP地址信息
    Intellij 快捷键
    java转换汉字为首字母搜索,
    gitee在linux下自动备份
    七牛云续费dns的ssl证书
    shiro 的realm的授权
    realme的shiro简单实现方法
    shiro初探,最简单的认证,通过ini文件。
    git config file
  • 原文地址:https://www.cnblogs.com/graph/p/3252079.html
Copyright © 2011-2022 走看看