二叉树转换成双向链表

来源:互联网 发布:js 设置控件不可用 编辑:程序博客网 时间:2024/04/30 13:18

二叉树中,每个节点都有两个指针,双向链表中每个节点也有两个指针。在转换过程中,我们可以让双向链表中的节点的前驱指向左孩子的最右断,后继指向右孩子的最左端。代码如下:



struct BinaryTree
{
char data;
BinaryTree *mLeft;
BinaryTree *mRight;
};


BinaryTree* BuyNode()
{
BinaryTree *s = (BinaryTree*)malloc(sizeof(BinaryTree));
memset(s,0,sizeof(BinaryTree));
return s;
}
void FreeNode(BinaryTree *s)
{
free(s);
s=NULL;
}
 
BinaryTree* CreateTree(char *&str)
{
BinaryTree *s = NULL;
if(*str!='#')
{
s = BuyNode();
s->data = *str;
s->mLeft = CreateTree(++str);
s->mRight = CreateTree(++str);
}
return s;
}


void ConvertNode(BinaryTree *root,BinaryTree **pLastNode)
{
if(root==NULL)return;
BinaryTree *pCurrent = root;
if(pCurrent->mLeft!=NULL)
{
ConvertNode(root->mLeft,pLastNode);
}
pCurrent->mLeft = *pLastNode;
if(*pLastNode!=NULL)
{
(*pLastNode)->mRight = pCurrent;
}
*pLastNode = pCurrent;


if(pCurrent->mRight!=NULL)
{
ConvertNode(root->mRight,pLastNode);
}
}
BinaryTree* Convert(BinaryTree *root)
{
BinaryTree *pLastNode = NULL;
ConvertNode(root,&pLastNode);


BinaryTree *HeadofList = pLastNode;
while(HeadofList!=NULL && HeadofList->mLeft!=NULL)HeadofList = HeadofList->mLeft;
return HeadofList;
}
int main()
{

char *str = "ABC##DE##F##G#H##";
BinaryTree *root = CreateTree(str);


BinaryTree *pHead = Convert(root);
return 0;
}

0 0
原创粉丝点击