我试图在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的下一个。递归申请子树。
当我尝试打印head.right时,它会给我Null指针异常。
Exception in thread "main" java.lang.NullPointerException
at BTtoDll.main(BTtoDll.java:153)
第153行是 -
System.out.println(t.head.right.data);
答案 0 :(得分:2)
在此,您将x.left
和x.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;
}
正如人们所看到的,有几种可以想象的变化。