Java中的静态类类型变量

时间:2014-06-07 13:36:29

标签: java object static pass-by-reference nodes

问题:在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”表现得像任何静态变量,其中变量的值可以从任何函数更改。

1 个答案:

答案 0 :(得分:0)

参数last隐藏静态字段。请改用extract_leaves_to_DLL.last