Java中的静态类类型变量



问题:在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

最新更新