笔试题:二元查找树转变成排序的双向链表

题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。

   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;

}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值