首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免递归中的静态变量

避免递归中的静态变量
EN

Stack Overflow用户
提问于 2019-04-17 13:25:49
回答 1查看 56关注 0票数 0

我的树节点被定义为:

代码语言:javascript
复制
class Node{
int data;
Node left,right;
Node(int d)
{
    data=d;
    left=null;
    right=null;
}
}

我正在编写一个代码,用于从二叉树构造一个双链接列表(nodes in which should be in the inorder traversal of the given tree)

我的问题是,第二个方法如何工作。我不明白,我想知道它的作用(我根据其他一些例子编写了方法-2)

我用两种方式来处理它:

1)使用静态变量prev (用于维护前一个节点)

2)不使用它(使用类)

方法-1如下所示:

代码语言:javascript
复制
//method-1
static Node previous=null,head=null;     
Node Btree2DLL(Node n) /
{
    if(n==null)
        return n;
    Btree2DLL(n.left);
    if(previous==null)
    {
        head=n;
    }
    else
    {
        previous.right=n;
        n.left=previous;
    }
    previous=n;
    Btree2DLL(n.right);
    return head;
}

方法-2如下:

代码语言:javascript
复制
//method-2
class PreviousandHead
{
    Node HEADOFDLL,PREV;
}
Node Tree2DLL(Node n)
{
    PreviousandHead p=new PreviousandHead();
    return Btree2DLL(n,p);  
}

Node Btree2DLL(Node n,PreviousandHead p)
{   
    if(n==null)
        return n;
    Btree2DLL(n.left,p);
    if(p.PREV==null)
    {
        p.HEADOFDLL=n;
    }
    else
    {
        p.PREV.right=n;
        n.left=p.PREV;
    }
    p.PREV=n;
    Btree2DLL(n.right,p);
    return p.HEADOFDLL;
}

早些时候,我尝试在method-2中传递参数,而不将类PreviousandHead创建为:

代码语言:javascript
复制
Node B2DLL(Node n)
{
    return Btree2DLL(n,null,null);  
}

Node Btree2DLL(Node n,Node previous,Node head)
{
if(n==null)
        return n;
    Btree2DLL(n.left,Node previous,Node head);
    if(previous==null)
    {
        head=n;
    }
    else
    {
        previous.right=n;
        n.left=previous;
    }
    previous=n;
    Btree2DLL(n.right,Node previous,Node head);
    return head;
}

没有用,我想他们每次都在创建新的实例。

EN

回答 1

Stack Overflow用户

发布于 2019-04-17 22:04:50

看来第二种方法是可行的,但最后一种方法却行不通。原因是在最后一个方法中,您将引用的副本传递给节点(参数previoushead)。因此,调用方将不会在被调用的方法中看到previoushead的变化。

有关这方面的更多信息,您可以阅读文章https://www.javaworld.com/article/2077424/learn-java-does-java-pass-by-reference-or-pass-by-value.html

我认为,如果您将参数previoushead的类型从Node更改为AtomicReference<Node>,则代码将正常工作。

代码语言:javascript
复制
    Node b2DLL(Node n)
    {
        return btree2DLL(n, new AtomicReference<>(), new AtomicReference<>());
    }

    Node btree2DLL(Node n, AtomicReference<Node> previous, AtomicReference<Node> head)
    {
        if(n == null)
            return n;
        btree2DLL(n.left, previous, head);
        if(previous.get() == null)
        {
            head.set(n);
        }
        else
        {
            previous.get().right = n;
            n.left = previous.get();
        }
        previous.set(n);
        btree2DLL(n.right, previous, head);
        return head.get();
}

在Java世界中,它被认为是以小写开始一个方法名。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55728625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档