问题:在Java中将二叉树的叶子提取到双链表。 让以下为输入二叉树
! 1 / \ 2 3 / \ \ 4 5 6 / \ / \ 7 8 9 10
输出: 双重链表 7 LT - →8 LT; - > 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”来跟踪最后访问的叶子,以便它可以与当前节点链接(如果它是叶子)。我最后声明为“静态节点最后”,希望像“静态int”一样,它也不会在退出函数后改变它所指向的节点。
但是,在这里,尽管声明为静态,但“last”假定它在父函数中离开子函数时具有的值。因此,last始终保持为null,并且不跟踪前一个叶节点。
因此列表为空。请建议如何使“last”表现得像任何静态变量,其中变量的值可以从任何函数更改。
答案 0 :(得分:0)
参数last
隐藏静态字段。请改用extract_leaves_to_DLL.last
。