思想:以某个节点为根的子树所生成的链表=(左子树生成的链表)+根节点+(右子树生成的链表)
递归函数如下:
pNode tree_2_list(pNode pRoot, pNode& head, int flag)
{
if(pRoot)
{
//查找到最左边的双链表的头
if(head == NULL)
{
if(pRoot->left == NULL && pRoot->right == NULL)
head = pRoot;
}
//查找左边双链表
pNode left = tree_2_list(pRoot->left, head,0x00);
if(left)
left->right = pRoot;
//当前节点与左子树连接
pRoot->left = left;
//查找右边的双链表
pNode right = tree_2_list(pRoot->right,head,0x01);
if(right)
right->left = pRoot;
//当前节点和右子树的头节点相连
pRoot->right = right;
//如果右子树不为空,则一直遍历到右子树所在链表的最右端
if(right)
{
while(right->right)
{
right = right->right;
}
}
pNode ret = NULL;
if(flag == 0x00)//当前是左子树,则返回最右边的指针
ret = right ? right : pRoot;
else if(flag == 0x01)//当前是右子树,则返回当前最左边的指针
ret = left ? left : pRoot;
return ret;
}
else
return NULL;
}
注:head是保留双链表的头指针