Java 二叉树到双链表的转换
我正试图用java编写一个函数,将二叉树转换为DLL。函数执行时没有错误,但未创建DLL。下面是函数。root是指向树的根的指针,head指向DLL的起始节点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
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;
}