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

你可能感兴趣的:(Binary search)