第15 题:
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/\ /\
5 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>
using namespace std;
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
};
void InsertNode(BSTreeNode* &pRoot,int value)
{
if (!pRoot)
{
pRoot=new BSTreeNode;
pRoot->m_nValue=value;
pRoot->m_pLeft=NULL;
pRoot->m_pRight=NULL;
}
else
{
if (pRoot->m_nValue>value)
{
InsertNode(pRoot->m_pLeft,value);
}
else if (pRoot->m_nValue<value)
{
InsertNode(pRoot->m_pRight,value);
}
else
{
cout<<"repeated insertation"<<endl;
}
}
}
void InOrder(BSTreeNode*pRoot)
{
if (!pRoot)
{
return;
}
else
{
if (pRoot->m_pLeft)
{
InOrder(pRoot->m_pLeft);
}
cout<<pRoot->m_nValue<<"\t";
if (pRoot->m_pRight)
{
InOrder(pRoot->m_pRight);
}
}
}
void Transfer(BSTreeNode* pRoot)
{
BSTreeNode* pTemp=pRoot->m_pLeft;
pRoot->m_pLeft=pRoot->m_pRight;
pRoot->m_pRight=pTemp;
if (pRoot->m_pLeft)
{
Transfer(pRoot->m_pLeft);
}
if (pRoot->m_pRight)
{
Transfer(pRoot->m_pRight);
}
}
int main()
{
BSTreeNode *pRoot=NULL;
InsertNode(pRoot,8);
InsertNode(pRoot,6);
InsertNode(pRoot,10);
InsertNode(pRoot,5);
InsertNode(pRoot,7);
InsertNode(pRoot,9);
InsertNode(pRoot,11);
cout<<"before transferred"<<endl;
InOrder(pRoot);
Transfer(pRoot);
cout<<"\n after transferred"<<endl;
InOrder(pRoot);
return 0;
}