【发布时间】:2012-03-07 22:35:51
【问题描述】:
这是一个将二叉搜索树转换为排序双向链表的函数。其思想是进行中序遍历,并将访问的节点放入大小为2的循环数组中。然后调整左右指针进行转换到双向链表。当前节点的右指针永远不会被修改和访问。问题出在哪里?
void TreetoQueue(node* tnode)
{static node* arr[2]={NULL,NULL};
static int index=0;
if(tnode==NULL) return;
TreetoQueue(tnode->left);
arr[index]=tnode; //current node
if(arr[1]!=NULL)
{ if(index==0)
{arr[1]->right=arr[0]; //modify right pointer of inorder predecessor to point to current node
arr[0]->left=arr[1]; //modify current node's left pointer to point to inorder predecessor
}
if(index==1)
{arr[0]->right=arr[1];
arr[1]->left=arr[0];
}
cout<<"index-"<<index<<" "<<arr[0]->val<<" "<<arr[1]->val<<"\n";
}
index=(index+1)%2;
TreetoQueue(tnode->right);
}
_______5______
/ \
___3__ 6__
/ \ \
1 4 _9
/ \
7 10
index-1 1 3
index-0 4 3
index-1 4 5
index-0 6 5
index-1 6 7
index-0 9 7
index-1 9 10
node->left->left->right is NULL //Intended to be 3
node->left->right->left is NULL//intended to be 3
node->left->right->right is NULL//intended to be 5
编辑:它按预期工作。只是我必须将根更改为列表的开头。我使用另一个函数来执行此操作。我可以在没有额外功能的情况下实现这一点吗?
node* TreetoQueue2(node* root)
{node* head=root;
while(head->left!=NULL)
head=head->left;
TreetoQueue(root);
return head;
}
【问题讨论】:
-
你说
if(arr[1] != NULL)。最初它声明为NULL。我看不到它在任何时候都会改变。有什么我想念的吗? -
arr[index]=tnode 和 index=(index+1)%2.arr[1] 如您在输出中看到的那样发生变化
-
你能解释一下你奇怪的缩进方案吗?
-
我认为是因为索引是静态的,但我无法理解你的想法
-
你确定你的树是你认为的那样吗?如果发布的代码收到有效的树,我看不到任何导致段错误的原因。
标签: c++ c algorithm binary-tree