您的位置:首页 > 其它

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

2013-09-02 09:31 399 查看
题目:

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。

要求不能创建任何新的结点,只调整指针的指向。

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;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: