把二元查找树转变成排序的双向链表

来源:互联网 发布:iuu免费短信软件 编辑:程序博客网 时间:2024/06/06 17:00
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树节点的数据结构如下:
struct BSTreeNode
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node

};

[cpp] view plain copy
 print?
  1. #include <iostream>  
  2. #include <vector>  
  3.   
  4. using namespace std;  
  5.   
  6. struct BSTreeNode  
  7. {  
  8.  int m_nValue;  
  9.  BSTreeNode *m_pLeft;  
  10.  BSTreeNode *m_pRight;  
  11. };  
  12.   
  13.   
  14. BSTreeNode* createNode(int num)  
  15. {  
  16.  BSTreeNode* node = (BSTreeNode*)malloc(sizeof(BSTreeNode));  
  17.   
  18.  if(!node)  
  19.   return NULL;  
  20.  node->m_nValue = num;  
  21.  node->m_pLeft = NULL;  
  22.  node->m_pRight = NULL;  
  23.   
  24.  return node;  
  25. }  
  26. BSTreeNode* createTree()  
  27. {  
  28.  BSTreeNode* root = createNode(10);  
  29.   
  30.  root->m_pLeft = createNode(6);  
  31.  root->m_pRight = createNode(14);  
  32.   
  33.  root->m_pLeft->m_pLeft = createNode(4);  
  34.  root->m_pLeft->m_pRight = createNode(8);  
  35.   
  36.  root->m_pRight->m_pLeft = createNode(12);  
  37.  root->m_pRight->m_pRight = createNode(16);  
  38.   
  39.  return root;  
  40.   
  41. }  
  42.   
  43. //中序遍历  
  44. void middleTraverse(BSTreeNode* root, vector<BSTreeNode* > &vec)  
  45. {  
  46.  if(root == NULL)  
  47.   return;  
  48.  middleTraverse(root->m_pLeft,vec);  
  49.  vec.push_back(root);  
  50.  middleTraverse(root->m_pRight,vec);  
  51. }  
  52.   
  53.   
  54. int main()  
  55. {  
  56.  BSTreeNode* root = createTree();  
  57.  vector<BSTreeNode*> vec;  
  58.  middleTraverse(root, vec);  
  59.   
  60.  BSTreeNode* pHead = *(vec.begin());  
  61.    
  62.  for(vector<BSTreeNode*>::iterator iter = vec.begin(); iter != vec.end(); ++iter)  
  63.  {  
  64.   if(iter == vec.end() -1)  
  65.    (*iter)->m_pRight = NULL;  
  66.   else  
  67.    (*iter)->m_pRight = *(iter+1);  
  68.   if(iter == vec.begin())  
  69.    (*iter)->m_pLeft = NULL;  
  70.   else  
  71.    (*iter)->m_pLeft = *(iter-1);  
  72.  }  
  73.   
  74.  for(BSTreeNode* temp = pHead; temp != NULL; temp = temp->m_pRight)  
  75.   cout<<temp->m_nValue<<" ";  
  76.   
  77.  cout<<endl;  
  78.   
  79.  return 0;  
  80. }  
  81.   
  82.