题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
//递归求二元查找树的镜像(即左右子树指针互换)
void MirrorRecursively(BTree pNode)
{
if (NULL == pNode)
return;
//左右子树互换
BTree temp = pNode->lchild;
pNode->lchild = pNode->rchild;
pNode->rchild = temp;
MirrorRecursively(pNode->lchild);
MirrorRecursively(pNode->rchild);
}
//非递归求二元查找树的镜像方法1
void NonRecurMirror_1(BTree pNode)
{
stack<BTree> stck;
set<BTree> s;
while (pNode!=NULL || !stck.empty())
{
while (pNode != NULL)
{
BTree temp = pNode->lchild;
pNode->lchild = pNode->rchild;
pNode->rchild = temp;
stck.push(pNode);
pNode = pNode->lchild;
}
if (!stck.empty())
{
pNode = stck.top();
stck.pop();
pNode = pNode->rchild;
}
}
}
//非递归求二元查找树的镜像方法2
void NonRecurMirror_2(BTree pNode)
{
if (NULL == pNode)
{
cout << "空树" <<endl;
return;
}
stack<BTree> stck;
stck.push(pNode);
while (!stck.empty())
{
pNode = stck.top();
stck.pop();//出栈
BTree temp = pNode->lchild;
pNode->lchild = pNode->rchild;
pNode->rchild = temp;
if (pNode->rchild)
stck.push(pNode->rchild);
if (pNode->lchild)
stck.push(pNode->lchild);
}
}