把二元查找树转变成排序的双向链表
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;
}
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
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;
}
相关文章推荐
- 把二元查找树转变成排序的双向链表
- 1.把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 天天算法03——二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表…
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表[数据结构]
- 把二元查找树转变成排序的双向链表
- 把二元查找树转变成排序的双向链表
- 微软面试题——把二元查找树转变成排序的双向链表
- 转载 把二元查找树转变成排序的双向链表
- 每天一道算法题(8)——把二元查找树转变成排序的双向链表
- 微软面试(1/100)---把二元查找树转变成排序的双向链表
- 非中序遍历思路把二元查找树转变成排序的双向链表的分析
- 把二元查找树转变成排序的双向链表
- 二元查找树转变成排序的双向链表
- 【面试题】把二元查找树转变成排序的双向链表
- 程序员面试题精选(1):把二元查找树转变成排序的双向链表
- 二元查找树转变成排序的双向链表