输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
要求不能创建任何新的结点,只调整指针的指向。
10
/ /
6 14
/ / / /
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
#include <stdio.h>
#include <stdlib.h>
typedef struct BSTreeNode
{
int m_nValue;
struct BSTreeNode *m_pLeft;
struct BSTreeNode *m_pRight;
}BSTreeNode_T;
typedef struct BSTreeNode DoubleList;
DoubleList *pHead;
DoubleList *pListIndex;
void convertToDoubleList(BSTreeNode_T *pCurrent);
/*创建二元查找树*/
void addBSTreeNode(BSTreeNode_T **pCurrent, int value)
{
if(NULL == *pCurrent)
{
BSTreeNode_T *pBTr = (BSTreeNode_T *)malloc(sizeof(BSTreeNode_T));
pBTr->m_pLeft = NULL;
pBTr->m_pRight = NULL;
pBTr->m_nValue = value;
*pCurrent = pBTr;
}
else
{
if(((*pCurrent)->m_nValue) > value)
{
addBSTreeNode(&((*pCurrent)->m_pLeft), value);
}
else if(((*pCurrent)->m_nValue) < value)
{
addBSTreeNode(&((*pCurrent)->m_pRight), value);
}
else
{
printf("重复加入节点\n");
}
}
}
/*遍历二元查找树 中序*/
void ergodicBSTree(BSTreeNode_T *pCurrent)
{
if(NULL == pCurrent)
{
return;
}
if(NULL != pCurrent->m_pLeft)
{
ergodicBSTree(pCurrent->m_pLeft);
}
/*节点接到链表尾部*/
convertToDoubleList(pCurrent);
if(NULL != pCurrent->m_pRight)
{
ergodicBSTree(pCurrent->m_pRight);
}
}
void convertToDoubleList(BSTreeNode_T* pCurrent)
{
printf("%d\n", pCurrent->m_nValue);
pCurrent->m_pLeft = pListIndex;
if(NULL != pListIndex)
{
pListIndex->m_pRight = pCurrent;
}
else
{
pHead = pCurrent;
}
pListIndex = pCurrent;
}
int main(void)
{
BSTreeNode_T *pRoot = NULL;
pListIndex = NULL;
pHead = NULL;
addBSTreeNode(&pRoot, 10);
addBSTreeNode(&pRoot, 4);
addBSTreeNode(&pRoot, 6);
addBSTreeNode(&pRoot, 8);
addBSTreeNode(&pRoot, 12);
addBSTreeNode(&pRoot, 14);
addBSTreeNode(&pRoot, 15);
addBSTreeNode(&pRoot, 16);
ergodicBSTree(pRoot);
return 0;
}