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?

    1.O(n) space solution

    中序遍历该BST,得到所有整数对齐排好序,对节点重新进行赋值

     1 /**
     2  * Definition for binary tree
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public void recoverTree(TreeNode root) {
    12         // Start typing your Java solution below
    13         // DO NOT write main() function
    14         if(root == null){
    15             return ;
    16         }
    17         ArrayList<TreeNode> nodes = new ArrayList<TreeNode>();
    18         ArrayList<Integer> values = new ArrayList<Integer>();
    19         inOrderTraverse(root, nodes, values);
    20         Collections.sort(values);
    21         for(int i = 0; i < nodes.size(); i++){
    22             nodes.get(i).val = values.get(i);
    23         }
    24     }
    25     
    26     public void inOrderTraverse(TreeNode node, ArrayList<TreeNode> nodes, ArrayList<Integer> values){
    27         if(node == null){
    28             return;
    29         }
    30         if(node.left != null){
    31             inOrderTraverse(node.left, nodes, values);
    32         }
    33         nodes.add(node);
    34         values.add(node.val);
    35         if(node.right != null){
    36             inOrderTraverse(node.right, nodes, values);
    37         }
    38     }
    39 }

     2.using two pointer, worst case O(n) space cost, average O(logN)

    have some strange problem, pre is alway null!

     1 /**
     2  * Definition for binary tree
     3  * public class TreeNode {
     4  *     int val;
     5  *     TreeNode left;
     6  *     TreeNode right;
     7  *     TreeNode(int x) { val = x; }
     8  * }
     9  */
    10 public class Solution {
    11     public void recoverTree(TreeNode root) {
    12         // Start typing your Java solution below
    13         // DO NOT write main() function
    14         if(root == null){
    15             return ;
    16         }
    17         TreeNode p1 = null, p2 = null, pre = null;
    18         find(root, p1, p2, pre);
    19         swap(p1, p2);
    20     }
    21     
    22     public void find(TreeNode node, TreeNode p1, TreeNode p2, TreeNode pre){
    23         if(node == null){
    24             return;
    25         }
    26         find(node.left, p1, p2, pre);
    27         if(pre != null && node.val < pre.val){
    28             if(p1 == null){
    29                 p1 = pre;
    30             } else {
    31                 p2 = node;
    32             }
    33         }
    34         pre = node;
    35         find(node.right, p1, p2, node);
    36     }
    37     
    38     public void swap(TreeNode p1, TreeNode p2){
    39         if(p1 != null && p2 != null){
    40             int tmp = p1.val;
    41             p1.val = p2.val;
    42             p1.val = tmp;
    43         }
    44     }
    45 }

    3. using threaded binary tree to do the inorder traverse

    http://tech-wonderland.net/blog/leetcode-recover-binary-search-tree.html

    http://fisherlei.blogspot.com/2012/12/leetcode-recover-binary-search-tree.html

  • 相关阅读:
    跳转练习
    从入门到自闭之Python--Redis
    从入门到自闭之Python--Django Rest_Framework
    从入门到自闭之Python--RESTful API规范与序列化
    从入门到自闭之Python--虚拟环境如何安装
    从入门到自闭之Python集合,深浅拷贝(大坑)
    从入门到自闭之Python编码
    从入门到自闭之Python字典如何使用
    从入门到自闭之Python列表,元祖及range
    从入门到自闭之Python整型,字符串以及for循环
  • 原文地址:https://www.cnblogs.com/feiling/p/3261005.html
Copyright © 2011-2022 走看看