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

本文介绍如何将一棵二叉查找树转换为排序的双向链表,通过中序遍历并调整节点间的指针指向实现转换过程,最终形成有序的链表结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
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.    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值