解题思路参考博客:http://blog.youkuaiyun.com/v_july_v, 表示感谢
1.把二元查找树转变成排序的双向链表(树)
题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
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>
using namespace std;
//定义树的结构
typedef struct BSTreeNode
{
int m_nValue;
BSTreeNode *m_pleft,*m_pright;
}binTree;
//创建二叉树
void createT(binTree *&rootNode,binTree *tempNode)
{
if(rootNode==NULL)
{
rootNode=tempNode; return;
}
else
{
if(rootNode->m_nValue > tempNode->m_nValue)
{
createT(rootNode->m_pleft,tempNode);
}
else if(rootNode->m_nValue < tempNode->m_nValue)
{
createT(rootNode->m_pright,tempNode);
}
}
}
//先序遍历二叉树
void preOrder(binTree *rootNode)
{
if(rootNode==NULL)return ;
else
{
cout<<rootNode->m_nValue<<" ";
preOrder(rootNode->m_pleft);
preOrder(rootNode->m_pright);
}
}
void helper(BSTreeNode *&head, BSTreeNode *& tail, BSTreeNode *root)
{
BSTreeNode *lt, *rh;
if(NULL == root)
{
head=NULL;
tail=NULL;
return ;
}
helper(head,lt,root->m_pleft);
helper(rh,tail,root->m_pright);
if(lt!=NULL)
{
lt->m_pright=root;
root->m_pleft=lt;
}
else head=root;
if(rh!=NULL)
{
root->m_pright=rh;
rh->m_pleft=root;
}
else tail=root;
}
BSTreeNode * treeToLinkerList(BSTreeNode * root) //递归实现转换
{
BSTreeNode *head, *tail;
helper(head,tail,root);
return head;
}
int main()
{
binTree *rootNode,*tNode,*head,*p;
rootNode=NULL; tNode=NULL;
int ch;
cin>>ch;
while(ch!=-1) //输入-1结束二叉树的创建
{
tNode=new binTree;
tNode->m_nValue=ch; tNode->m_pleft=NULL; tNode->m_pright=NULL;
createT(rootNode,tNode);
cin>>ch;
}
if(rootNode==NULL)
{
cout<<"Tree is NULL."<<endl;
}
else
{
cout<<"preOrder: "; //前序遍历查看创建的二叉树
preOrder(rootNode); cout<<endl;
}
head=treeToLinkerList(rootNode); //转换成双向链表
p=head;
while(NULL != p->m_pright) //输出双向链表
{
cout<<p->m_nValue<<" ";
p=p->m_pright;
}
cout<<p->m_nValue<<endl; //输出链表的最后一个值
return 0;
}