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?

 

solution 1 using O(n) space:

 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          ArrayList<TreeNode> Inorder = InOrderTraversal(root);
13         int firstViolation = 0;
14         int secondViolation = 0;
15         int length = Inorder.size();
16         if(!Inorder.isEmpty()){
17             int i = 0;
18             for(; i <length - 1; ++i){
19                 if(Inorder.get(i).val > Inorder.get(i + 1).val){
20                     firstViolation = i;
21                     break;
22                 }                    
23             }
24             ++i;
25             for(; i < length - 1; ++i){
26                 if(Inorder.get(i).val > Inorder.get(i + 1).val){
27                     secondViolation = i + 1;
28                     break;
29                 }                    
30             }
31         }
32         if(secondViolation == 0)
33             secondViolation = firstViolation + 1;
34         int temp = Inorder.get(firstViolation).val;
35         Inorder.get(firstViolation).val = Inorder.get(secondViolation).val;
36         Inorder.get(secondViolation).val = temp;        
37     }
38     public ArrayList<TreeNode> InOrderTraversal(TreeNode root){
39         ArrayList<TreeNode> InOrder = new ArrayList<TreeNode>();
40         if(root != null){
41             if(root.left != null){
42                 ArrayList<TreeNode> leftChild = InOrderTraversal(root.left);
43                 InOrder.addAll(leftChild);
44             }
45             InOrder.add(root);
46             if(root.right != null){
47                 ArrayList<TreeNode> rightChild = InOrderTraversal(root.right);
48                 InOrder.addAll(rightChild);
49             }
50         }
51         return InOrder;
52     }
53 }

 

Solution2: using O(1) extra space: 

 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         if(root != null){
13             inOrder(root);
14             int temp = firstViolation.val;
15             firstViolation.val = secondViolation.val;
16             secondViolation.val = temp;
17         }
18     }
19     
20     public void inOrder(TreeNode root){
21         if(root != null){
22             if(root.left != null)
23                 inOrder(root.left);
24             if(previous == null)
25                 previous = root;
26             else{
27                 if(previous.val > root.val){
28                     if(firstViolation == null)
29                         firstViolation = previous;
30                     secondViolation = root;                        
31                 }
32                 previous = root;
33             }            
34             if(root.right != null)
35                 inOrder(root.right);
36         }
37     }    
38     TreeNode previous = null;
39     TreeNode firstViolation = null;
40     TreeNode secondViolation = null;
41 }

 

 

转载于:https://www.cnblogs.com/averillzheng/p/3536156.html

LeetCode-Editor是一种在线编码工具,它提供了一个用户友好的界面编写和运行代码。在使用LeetCode-Editor时,有时候会出现乱码的问题。 乱码的原因可能是由于编码格式不兼容或者编码错误导致的。在这种情况下,我们可以尝试以下几种解决方法: 1. 检查文件编码格式:首先,我们可以检查所编辑的文件的编码格式。通常来说,常用的编码格式有UTF-8和ASCII等。我们可以将编码格式更改为正确的格式。在LeetCode-Editor中,可以通过界面设置或编辑器设置来更改编码格式。 2. 使用正确的字符集:如果乱码是由于使用了不同的字符集导致的,我们可以尝试更改使用正确的字符集。常见的字符集如Unicode或者UTF-8等。在LeetCode-Editor中,可以在编辑器中选择正确的字符集。 3. 使用合适的编辑器:有时候,乱码问题可能与LeetCode-Editor自身相关。我们可以尝试使用其他编码工具,如Text Editor、Sublime Text或者IDE,看是否能够解决乱码问题。 4. 查找特殊字符:如果乱码问题只出现在某些特殊字符上,我们可以尝试找到并替换这些字符。通过仔细检查代码,我们可以找到导致乱码的特定字符,并进行修正或替换。 总之,解决LeetCode-Editor乱码问题的方法有很多。根据具体情况,我们可以尝试更改文件编码格式、使用正确的字符集、更换编辑器或者查找并替换特殊字符等方法来解决这个问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值