一题一句:
BST 的内在性质,inorder traversal 里遵循的左小右大关系是突破口,俩个node错位最多只会导致出现俩次左大右小,只需交换第一次的前一个和第二次的后一个,若只有一次错位,则很简单。
经典题目补充:简而言之,java 传参传入的是指针,一担指针地址在方程内被改写,指针便与原来的地址失去关联。
这个题目有一点很有启发性,尤其对于java语言的新手。prev传参数是用一个arrayList(尽管只有一个node),如果把prev 当成ListNode 传入,是不对的。Java的传参,传的是指针的值。所以你可以认为是传reference ,也可以认为传copy。因为它传的是reference的copy(本质上异与value的copy)。所以一但你把这个reference 指向了别的obj,从此这个变量名就与起初它指向的值失去了关联。 他开始指向新的obj了。 简而言之,传入了指针,一担指针地址被改写,指针便不再指向原来的地址。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public void recoverTree(TreeNode root) {
if(root == null){
return ;
}
ArrayList
res = new ArrayList
();
ArrayList
prev = new ArrayList
();
prev.add(null);
helper(root,prev,res);
if(res.size() > 0){
int temp = res.get(0).val;
res.get(0).val = res.get(1).val;
res.get(1).val = temp;
}
}
public void helper(TreeNode root,ArrayList
prev, ArrayList
res){ if(root == null){ return; } helper(root.left,prev,res); if(prev.get(0) != null && prev.get(0).val > root.val){ if(res.size() == 0){ res.add(prev.get(0)); res.add(root); }else{ res.set(1,root); } } prev.set(0,root); helper(root.right,prev,res); } }