将二叉树转换为双链表

时间:2014-02-21 16:53:07

标签: 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)
            {
                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);
            }




        }

    }
}

逻辑如下: 在左子树中找到最右边的,并且make是root的前一个节点,在右子树中找到最左边的,然后在root的下一个。递归申请子树。

enter image description here

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

Exception in thread "main" java.lang.NullPointerException
        at BTtoDll.main(BTtoDll.java:153)

第153行是 -

 System.out.println(t.head.right.data);

3 个答案:

答案 0 :(得分:2)

在此,您将x.leftx.right分配给x

if(x.left!=null)
{
    ...
    rightmost=x;
    x.left=rightmost;
    ...
}
if(x.right!=null)
{
    ...
    leftmost=x;
    x.right=leftmost;
    ...
}

我不知道该说什么改变它应该是什么,但这可能是你的错误。该列表不会重新链接。

答案 1 :(得分:0)

至于你的NullPointerException,我认为

          while(leftmost!=null)

应该是

          while(leftmost.left!=null)

答案 2 :(得分:0)

纯递归函数实际上也是一样的:左边子树的最右边连接到x,x连接到右边子树的最左边。 我认为你可能有兴趣看到这种一致性。

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;
}

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