问题:在Java中将二叉树的叶子提取到双链表中。让以下内容作为输入二进制树
1./\2 3/\\4 5 6/\/\7 8 9 10
输出:双重链接列表7<->8<->5<->9<->10
我的代码:
import java.io.*;
class Node
{
int data;
Node left;
Node right;
Node(int d)
{
data=d;
left=null;
right=null;
}
}
class extract_leaves_to_DLL
{
static Node last=null; //PLEASE SEE HERE
static void extractL(Node root, Node last)
{
if(root==null)
return;
if(root.left==null && root.right==null)
{
if(last!=null)
{
root.right=last;
last.left=root;
}
last=root; //LAST=ROOT ONLY WITHIN THIN FUNCTION
// IT BECOMES NULL AS SOON AS IT GETS OUT FROM THIS FUNCTION
return;
}
if(root.left!=null)
{
extractL(root.left,last);
}
if(root.right!=null)
{
extractL(root.right,last);
}
}
static void printReverseDLL(Node last)
{
if(last==null)
return;
while(last.left!=null)
last=last.left;
while(last.right!=null)
{
System.out.print(last.data+" -> ");
last=last.right;
}
}
public static void main(String args[]) throws IOException
{
Node root=new Node(1);
root.left=new Node(2);
root.right=new Node(3);
root.left.left=new Node(4);
root.left.right=new Node(5);
root.right.right=new Node(6);
root.left.left.left=new Node(7);
root.left.left.right=new Node(8);
root.right.right.left=new Node(9);
root.right.right.right=new Node(10);
extractL(root,last);
printReverseDLL(last);
}
}
在这里,我使用了Node类类型的变量"last"来跟踪访问的最后一个叶,这样,如果它是一个叶的话,它就可以与当前节点链接。我将last声明为"static Node last",希望它和"static int"一样,在退出函数后也不会更改它所指向的节点。
但是,在这里,尽管声明为static,"last"在离开子函数时,会假设它在父函数中的值。因此,last始终保持为null,并且不会跟踪上一个叶节点。
因此,该列表为空。请建议如何使"last"表现得像任何静态变量,其中变量的值可以从任何函数更改。
参数last
隐藏静态字段。请改用extract_leaves_to_DLL.last
。