二叉搜索树(二叉查找树)转化为双向链表

 

 

 分析:

1:由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。

2:由于中序遍历过程正好是转换成链表的过程,即可采用递归处理

转换代码如下:

  1. struct BinaryTreeNode  
  2. {  
  3.     int m_nVlaue;  
  4.     BinaryTreeNode* m_pLeft;  
  5.     BinaryTreeNode* m_pRight;  
  6. };  
  7.   
  8. /* 
  9.     递归遍历中的转换过程 
  10.     参数:处理当前结点,当前链表的最后一个结点(初始值为空) 
  11.     */  
  12. void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList)  
  13. {  
  14.     if(pNode == NULL)  
  15.         return;  
  16.     BinaryTreeNode* pCurrent = pNode;  
  17.     //递归处理左子树  
  18.     if (pCurrent->m_pLeft != NULL)  
  19.         ConvertNode(pNode->m_pLeft,pLastNodeInList);  
  20.     //处理当前结点              
  21.     pCurrent->m_pLeft = *pLastNodeInList;    //将当前结点的左指针指向已经转换好的链表的最后一个位置  
  22.     if (*pLastNodeInList!=NULL)  
  23.         *pLastNodeInList->m_pRight = pCurrent;//将已转换好的链表的最后一个结点的右指针指向当前结点  
  24.   
  25.     *pLastNodeInList = pCurrent;//更新链表的最后一个结点  
  26.     //递归处理当前结点的右子树  
  27.     if (pCurrent->m_pRight != NULL)  
  28.         ConvertNode(pNode->m_pRight, pLastNodeInList);  
  29. }  
  30.   
  31. BinaryTreeNode* Convert(BinaryTreeNode* pRootInTree)  
  32. {  
  33.     BinaryTreeNode* pLastNodeInList = NULL;  
  34.   
  35.     ConvertNode(pRootInTree, &pLastNodeInList);  
  36.   
  37.     //pLastNodeInList指向双向链表的尾结点,再次遍历找到头结点  
  38.     BinaryTreeNode* pHeadOfList = pLastNodeInList;  
  39.     while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL)  
  40.         pHeadOfList = pHeadOfList->m_pLeft;  
  41.   
  42.     return pHeadOfList;  
  43. }  

测试代码如下:

创建一棵二叉排序树,可以调用http://blog.csdn.net/zhaojinjia/article/details/9314989方法生成。

  1. int _tmain(int argc, _TCHAR* argv[])  
  2. {  
  3.     int preorder[] = {10,6,4,8,14,12,16};    
  4.     int inorder[] = {4,6,8,10,12,14,16};    
  5.   
  6.     BinaryTreeNode* pRoot = Construct(preorder,inorder,7);     
  7.       
  8.     BinaryTreeNode* pList = Convert(pRoot);  
  9.   
  10.     while ( pList!=NULL )  
  11.     {  
  12.         cout << pList->m_nVlaue <<" ";  
  13.         pList = pList->m_pRight;  
  14.     }  
  15.     cout << endl;  
  16.     return 0;  
  17. }  

返回结果如下图所示:



 

posted on 2013-11-12 15:56  iwant2know  阅读(52)  评论(0)    收藏  举报

导航