剑指 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,所以会引发错误。