即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
7 9 11
输出:
8
/ \
10 6
/\ /\
11 9 7 5
定义二元查找树的结点为:
struct BSTreeNode // a node in the binary search tree (BST)
{
int m_nValue; // value of node
BSTreeNode *m_pLeft; // left child of node
BSTreeNode *m_pRight; // right child of node
};
分析:镜像转换无非就是对每个节点进行一个左右交换。
#include <iostream>
#include <queue>
using namespace std;
struct BNode
{
int key;
BNode *m_pl;
BNode *m_pr;
};
typedef BNode* T;
typedef queue<T> QET;
void CreateTree(BNode* &head)
{
QET qe;
head = new BNode();
cin >> head->key;
head->m_pl = head->m_pr = 0;
qe.push(head);
while ( !qe.empty() )
{
BNode *temp = qe.front();
qe.pop();
cout << temp->key << "的左右子女的关键字,空用-1表示:" << endl;
BNode *l = new BNode();
BNode *r = new BNode();
cin >> l->key >> r->key ;
if (l->key == -1)
delete l;
else
{
l->m_pl = l->m_pr = 0;
temp->m_pl = l;
qe.push(l);
}
if (r->key == -1)
delete r;
else
{
r->m_pl = r->m_pr = 0;
temp->m_pr = r;
qe.push(r);
}
}
return ;
}
void RecurWay(BNode *head)
{
if ( head == 0 )
return ;
RecurWay(head->m_pl);
RecurWay(head->m_pr);
BNode *s = head->m_pl;
head->m_pl = head->m_pr;
head->m_pr = s;
return ;
}
void CircuWay(BNode *head)
{
QET qe;
if ( head == 0 )
return ;
qe.push(head);
while ( !qe.empty() )
{
BNode *top = qe.front();
if ( top->m_pl )
qe.push(top->m_pl);
if ( top->m_pr )
qe.push(top->m_pr);
BNode *s = top->m_pl;
top->m_pl = top->m_pr;
top->m_pr = s;
qe.pop();
}
return ;
}
int main()
{
BNode *head = 0;
CreateTree(head);
RecurWay(head);
CircuWay(head);
return 0;
}