题目:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ /
6 10
// //
5 7 9 11
输出:
8
/ /
10 6
// //
11 9 7 5
答案:
//20130113
#include <iostream>
#include <list>
using namespace std;
typedef struct TNode
{
int num;
TNode* lnode;
TNode* rnode;
}TNode,*ptnode;
//逐层遍历序列,0代表空
/*树的机构
8
6 10
5 7 9 11
0 0 0 0 0 0 0 0
*/
int t1[]={8,6,10,5,7,9,11,0,0,0,0,0,0,0,0};
TNode* constructTree(const int tt[]);
void recuAlgorithm(ptnode &node);
void cirAlgorithm(ptnode &node);
int main()
{
ptnode pnode1=constructTree(t1);
recuAlgorithm(pnode1);
ptnode pnode2=constructTree(t1);
cirAlgorithm(pnode2);
return 0;
}
TNode* constructTree(const int tt[])
{
TNode *tn=new TNode;
tn->num=tt[0];
tn->lnode=NULL;
tn->rnode=NULL;
list<ptnode> tnl;
tnl.push_back(tn);
ptnode pnode;
int num=1;
while (!tnl.empty())
{
if (tt[num]!=0)
{
pnode=*(tnl.begin());
TNode *tns=new TNode;
tns->num=tt[num];
tns->lnode=NULL;
tns->rnode=NULL;
pnode->lnode=tns;
tnl.push_back(tns);
}
if (tt[num+1]!=0)
{
pnode=*(tnl.begin());
TNode *tns=new TNode;
tns->num=tt[num+1];
tns->lnode=NULL;
tns->rnode=NULL;
pnode->rnode=tns;
tnl.push_back(tns);
}
num=num+2;
tnl.pop_front();
}
return tn;
}
ptnode temp;
void recuAlgorithm(ptnode &node)
{
if (node == NULL)
{
return;
}
recuAlgorithm(node->lnode);
recuAlgorithm(node->rnode);
temp=node->rnode;
node->rnode=node->lnode;
node->lnode=temp;
}
void cirAlgorithm(ptnode &node)
{
list<ptnode> plist;
plist.push_back(node);
ptnode tempno;
ptnode temp;
while(plist.size()!=0)
{
tempno=plist.front();
temp=tempno->lnode;
tempno->lnode=tempno->rnode;
tempno->rnode=temp;
plist.pop_front();
if (tempno->lnode!=NULL)
{
plist.push_back(tempno->lnode);
}
if (tempno->rnode!=NULL)
{
plist.push_back(tempno->rnode);
}
}
}