局部变量引发的错误

剑指 Offer II 052. 展平二叉搜索树

今天在做这道题的时候,被困扰了很久,经过排错才发现是错误使用局部变量引发的错误

我的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public TreeNode increasingBST(TreeNode root) {
TreeNode head=new TreeNode();
TreeNode oldHead=head;
middle(root,head);
return oldHead.right;
}
public void middle(TreeNode node,TreeNode head){
if(node==null){
return;
}
middle(node.left,head);
head.right=node;
node.left=null;
head=node;
middle(node.right,head);
}

官方代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private TreeNode resNode;

public TreeNode increasingBST(TreeNode root) {
TreeNode dummyNode = new TreeNode(-1);
resNode = dummyNode;
inorder(root);
return dummyNode.right;
}

public void inorder(TreeNode node) {
if (node == null) {
return;
}
inorder(node.left);
// 在中序遍历的过程中修改节点指向
resNode.right = node;
node.left = null;
resNode = node;
inorder(node.right);
}

可以看出我的代码和官方代码基本一致,唯一的区别就是官方的resNode变量是全局的,而我的head变量是局部的。

为什么用局部变量会出错?

middle函数首先传入root,head;在对root.left进行递归的时候,head会不断变化,但由于是局部变量,函数执行之后就被销毁了,也就是说head只是局部的变化;middle(node.left,head)执行完毕,使用的head还是第一次传入的head,所以会引发错误。