// 把二叉树转换成双向链表.
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode *m_pLeft;
BinaryTreeNode *m_pRight;
public:
BinaryTreeNode(int v):m_nValue(v),m_pLeft(NULL),m_pRight(NULL){}
};
void Convert(BinaryTreeNode *t,BinaryTreeNode **head,BinaryTreeNode **last)
{
BinaryTreeNode *lh,*ll,*rh,*rl;
if(t!=NULL)
{
Convert(t->m_pLeft,&lh,&ll);
if(ll==NULL)
{
*head=t;
}
else
{
*head=lh;
ll->m_pRight=t;
t->m_pLeft=ll;
}
Convert(t->m_pRight,&rh,&rl);
if(rh==NULL)
{
t->m_pRight=NULL;
*last=t;
}
else
{
t->m_pRight=rh;
rh->m_pLeft=t;
*last=rl;
}
}
else
{
*head=NULL;
*last=NULL;
}
}
BinaryTreeNode b1(10),b21(6),b22(14),b31(4),b32(8),b33(12),b34(16);
void printMidOrder(BinaryTreeNode *t)
{
if(t)
{
printMidOrder(t->m_pLeft);
cout<<setw(5)<<t->m_nValue;
printMidOrder(t->m_pRight);
}
}
void main()
{
b1.m_pLeft=&b21;
b1.m_pRight=&b22;
b21.m_pLeft=&b31;
b21.m_pRight=&b32;
b22.m_pLeft=&b33;
b22.m_pRight=&b34;
BinaryTreeNode *head,*last;
printMidOrder(&b1);
Convert(&b1,&head,&last);
// 输出转换结果
BinaryTreeNode *p=head;
while(p!=NULL)
{
cout<<setw(5)<<p->m_nValue;
p=p->m_pRight;
}
system("pause");
}