Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 二叉树到双链表的转换_Java_Binary Tree_Doubly Linked List - Fatal编程技术网

Java 二叉树到双链表的转换

Java 二叉树到双链表的转换,java,binary-tree,doubly-linked-list,Java,Binary Tree,Doubly Linked List,我正试图用java编写一个函数,将二叉树转换为DLL。函数执行时没有错误,但未创建DLL。下面是函数。root是指向树的根的指针,head指向DLL的起始节点 public void dll(Node x) { if(x==null) { return; } else { if(x==root) { No

我正试图用java编写一个函数,将二叉树转换为DLL。函数执行时没有错误,但未创建DLL。下面是函数。root是指向树的根的指针,head指向DLL的起始节点

public void dll(Node x)
    {

        if(x==null)
        {
            return;
        }
        else
        {
            if(x==root)
            {
                Node temp=root;
                while(temp.left!=null)
                {
                    temp=temp.left;
                }
                head=temp;
            }

            if(x.left!=null)
            {
                System.out.println(x.data);

                Node lchild=x.left;
                Node rightmost=lchild;
                while(rightmost.right!=null)
                {
                    rightmost=rightmost.right;
                }
                x.left=rightmost;
                rightmost.right=x;
                dll(lchild);

            }
            if(x.right!=null)
            {
                System.out.println(x.data);

                Node rchild=x.right;
                Node leftmost=rchild;

                while(leftmost.left!=null)
                {
                    leftmost=leftmost.left;
                }

                x.right=leftmost;
                leftmost.left=x;
                dll(rchild);
            }




        }

    }
}
逻辑如下: 在左子树中找到最右边的节点,使其成为根的上一个节点,在右子树中找到最左边的节点,使其成为根的下一个节点。递归应用于子树

当我尝试打印head.right时,它会给我空指针异常

Exception in thread "main" java.lang.NullPointerException
        at BTtoDll.main(BTtoDll.java:153)
第153行是-

 System.out.println(t.head.right.data);
在这里,您可以将x.left和x.right指定给x:

我不知道该怎么说,该怎么改,但那可能是你的错误。列表不会被重新链接。

至于您的NullPointerException,我认为

          while(leftmost!=null)
应该是

          while(leftmost.left!=null)

纯递归函数实际上也是这样做的:左子树的最右边连接到x,x连接到右子树的最左边。我想你可能有兴趣去看看Congluity


正如人们所看到的,有几种变化是可以想象的。

所以我从你的标签上了解到你得到了NPE?你能用完整的stacktrace发布它吗?可能的重复是一个逻辑错误,不是NPE。请停止投票。我的逻辑中缺少了一些东西,这就是为什么节点没有正确连接,其他明智的头部右侧不应该为空,我知道什么是NPE,我不明白的是为什么头部右侧为空。我从标记中删除了NPE。没有详细检查您的代码。当我遇到节点时,我会按顺序遍历树并将节点添加到列表的末尾。您好,谢谢。我根据您的答案和其他一些答案更改了代码。但现在我的代码并没有终止,它并没有进入第二个if条件,我不知道为什么。
          while(leftmost.left!=null)
public DLL dll(Node x) {
    return dll(null, x, null);
}

public DLL dll(DLL before, Node x, DDL after) {
    if (x == null) {
        return;
    }
    if (x.left != null) {
        before = dll(before, x.left, null);
    }
    if (x.right != null) {
        after = dll(null, x.left, after);
    }
    DLL result = new DLL();
    result.insert(x.value);
    result.insertBefore(before); // null being a no-op.
    result.insertAfter(after); // null being a no-op.
    return result;
}