二叉搜索树与双向链表转化

来源:互联网 发布:淘宝店铺层级怎么计算 编辑:程序博客网 时间:2024/04/19 15:48
  1. 1:由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点。当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可。进而更新当前链表的最后一个结点指针。

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




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