题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16
解答:查找树进行中序遍历即可得到从小到大的顺序排列,所以采用中序遍历的方法进行转换,只是中序遍历的时候,不是简单的打印节点数据,而是要对得到的节点的指向进行修改,从而得到双向链表
// 树节点(也可以当成双向链表的节点)
typedef struct BTreeNode
{
int data;
struct BTreeNode *lChild; // 指向左孩子(查找树)或者指向前驱结点(双向链表)
struct BTreeNode *rChild; // 指向右孩子(查找树)或者指向后继结点(双向链表)
}BTreeNode;
// 创建一个前面所示的查找树
void CreateBtree( BTreeNode**Btree )
{
BTreeNode *tempNode= NULL, *rootNode= NULL;
rootNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
rootNode->data= 10;
tempNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
tempNode->data= 6;
rootNode->lChild= tempNode;
tempNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
tempNode->data= 14;
rootNode->rChild= tempNode;
tempNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
tempNode->data= 4;
rootNode->lChild->lChild = tempNode;
tempNode->lChild= NULL;
tempNode->rChild= NULL;
tempNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
tempNode->data= 8;
rootNode->lChild->rChild = tempNode;
tempNode->lChild= NULL;
tempNode->rChild= NULL;
tempNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
tempNode->data= 12;
rootNode->rChild->lChild = tempNode;
tempNode->lChild= NULL;
tempNode->rChild= NULL;
tempNode = (BTreeNode*)malloc( sizeof(BTreeNode) );
tempNode->data= 16;
rootNode->rChild->rChild = tempNode;
tempNode->lChild= NULL;
tempNode->rChild= NULL;
*Btree = rootNode;
}
//全局变量,用于指向双向链表的头结点和尾节点
BTreeNode*pHead=NULL;
BTreeNode*pTail=NULL;
// 调整结点指针指向
void convertToDoubleList(BTreeNode *pCurrent)
{
pCurrent->lChild=pTail;//使当前结点的左指针指向双向链表中最后一个结点
if (NULL==pTail)//若最后一个元素不存在,此时双向链表尚未建立,因此将当前结点设为双向链表头结点
{
pHead=pCurrent;
}
else//使双向链表中最后一个结点的右指针指向当前结点
{
pTail->rChild=pCurrent;
}
pTail=pCurrent;//将当前结点设为双向链表中最后一个结点
}
// 中序遍历查找树并调整节点指向得到双向链表
voidInOrder( BTreeNode *BTree )
{
if (BTree == NULL)
return;
// 中序遍历左子树
InOrder( BTree->lChild );
// 调整节点次序
convertToDoubleList(BTree);
// 中序遍历右子树
InOrder( BTree->rChild );
}
// 打印双向联表
void printList( BTreeNode *pHead )
{
while (pHead)
{
cout << pHead->data << " ";
pHead = pHead->rChild;
}
cout << endl;
}
int main()
{
BTreeNode *pRoot= NULL;
CreateBtree( &pRoot);
InOrder(pRoot);
printList( pHead);
system( "pause");
return 0;
}