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

来源:互联网 发布:淘宝特卖会 编辑:程序博客网 时间:2024/06/15 23:37
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
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

};

#include <iostream>#include <vector>using namespace std;struct BSTreeNode{ int m_nValue; BSTreeNode *m_pLeft; BSTreeNode *m_pRight;};BSTreeNode* createNode(int num){ BSTreeNode* node = (BSTreeNode*)malloc(sizeof(BSTreeNode)); if(!node)  return NULL; node->m_nValue = num; node->m_pLeft = NULL; node->m_pRight = NULL; return node;}BSTreeNode* createTree(){ BSTreeNode* root = createNode(10); root->m_pLeft = createNode(6); root->m_pRight = createNode(14); root->m_pLeft->m_pLeft = createNode(4); root->m_pLeft->m_pRight = createNode(8); root->m_pRight->m_pLeft = createNode(12); root->m_pRight->m_pRight = createNode(16); return root;}//中序遍历void middleTraverse(BSTreeNode* root, vector<BSTreeNode* > &vec){ if(root == NULL)  return; middleTraverse(root->m_pLeft,vec); vec.push_back(root); middleTraverse(root->m_pRight,vec);}int main(){ BSTreeNode* root = createTree(); vector<BSTreeNode*> vec; middleTraverse(root, vec); BSTreeNode* pHead = *(vec.begin());  for(vector<BSTreeNode*>::iterator iter = vec.begin(); iter != vec.end(); ++iter) {  if(iter == vec.end() -1)   (*iter)->m_pRight = NULL;  else   (*iter)->m_pRight = *(iter+1);  if(iter == vec.begin())   (*iter)->m_pLeft = NULL;  else   (*iter)->m_pLeft = *(iter-1); } for(BSTreeNode* temp = pHead; temp != NULL; temp = temp->m_pRight)  cout<<temp->m_nValue<<" "; cout<<endl; return 0;}