转换二元查找树为它的镜像

 题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。  
例如输入:
  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
};




//coder:LEE
//20120227
#include<iostream>
#include<CASSERT>
#include<QUEUE>
#include<Stack>
using namespace std;
struct BSTreeNode  
{
int m_nValue;
BSTreeNode* m_pLeft;
BSTreeNode * m_pRight;
};
void AddNode(BSTreeNode *& root,int n)
{
if (!root)
{
root=(BSTreeNode *)malloc(sizeof(BSTreeNode ));
root->m_nValue=n;
root->m_pLeft=NULL;
root->m_pRight=NULL;
return;
}
if(n<root->m_nValue)
AddNode(root->m_pLeft,n);
else
AddNode(root->m_pRight,n);
}
void Traverse(BSTreeNode * root)
{
if(!root)
return;

Traverse((root->m_pLeft));
cout<<root->m_nValue<<"  ";
Traverse(root->m_pRight);

}
void Swap(BSTreeNode  *&a,BSTreeNode  *&b)
{
BSTreeNode *t;
t=a;
a=b;
b=t;


}
void MirrorBiTree(BSTreeNode *&root)
{
if(!root)
return;
MirrorBiTree(root->m_pLeft);
MirrorBiTree(root->m_pRight);
Swap(root->m_pLeft,root->m_pRight);
}
void MirrorBiTreeWithQueue(BSTreeNode *root)
{
assert(root!=NULL);
queue <BSTreeNode *> q;
q.push(root);
while(!q.empty())
{
BSTreeNode *pCur=q.front();
q.pop();
if(pCur->m_pLeft!=NULL)
q.push(pCur->m_pLeft);
if(pCur->m_pRight!=NULL)
q.push(pCur->m_pRight);
Swap(pCur->m_pLeft,pCur->m_pRight);
}
}
void PreDisplayBiTreeWithStack(BSTreeNode *root)
{
assert(root!=NULL);
stack <BSTreeNode *> s;
s.push(root);
while(!s.empty())
{
BSTreeNode *pCur=s.top();
s.pop();
if(pCur->m_pRight!=NULL)
s.push(pCur->m_pRight);
if(pCur->m_pLeft!=NULL)
s.push(pCur->m_pLeft);
Swap(pCur->m_pLeft,pCur->m_pRight);
}

}
int main()
{
BSTreeNode * root=NULL;
AddNode(root,8);
AddNode(root,6);
AddNode(root,10);
AddNode(root,5);
AddNode(root,7);
AddNode(root,9);
AddNode(root,11);
Traverse(root);
cout<<endl;
PreDisplayBiTreeWithStack(root);
// MirrorBiTreeWithQueue(root);
cout<<endl;
Traverse(root);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值