您的位置:首页 > 其它

输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点。

2012-11-04 17:23 399 查看
#include <iostream>
#include <stack>
using namespace std;

//二叉树结构
typedef struct BinaryTreeNode
{
char m_chValue;
BinaryTreeNode *m_pLChild;
BinaryTreeNode *m_pRChild;
}BiTree;

//递归方式将树镜像
void BSTreeMirrored(BiTree *pTree)
{
if (NULL == pTree)
{
return;
}
else
{
//从叶到根镜像。(也可从根向叶镜像,只需把交换代码写到递归调用之前即可)
BSTreeMirrored(pTree->m_pLChild);
BSTreeMirrored(pTree->m_pRChild);

BiTree *pTemp = pTree->m_pLChild;
pTree->m_pLChild = pTree->m_pRChild;
pTree->m_pRChild = pTemp;
}
}

//非递归方式将树镜像(需借助栈来实现)
void NoRecursive(BiTree *pTree)
{
if (NULL == pTree)
{
return ;
}
BiTree *pTemp = NULL;
stack<BiTree*> s;
s.push(pTree);

while(!s.empty())
{
pTemp = s.top();
s.pop();

BiTree *pExchange =  pTemp->m_pLChild;
pTemp->m_pLChild = pTemp->m_pRChild;
pTemp->m_pRChild = pExchange;

if (NULL != pTemp->m_pLChild)
{
s.push(pTemp->m_pLChild);
}

if (NULL != pTemp->m_pRChild)
{
s.push(pTemp->m_pRChild);
}
}
}

//先序创建二叉树
BiTree *CreateBiTree(BiTree *pTree = NULL)
{
char ch;
cin>>ch;
if ('#' == ch)
{
pTree = NULL;
}
else
{
pTree = new BiTree;
pTree->m_chValue = ch;
pTree->m_pLChild = CreateBiTree(pTree->m_pLChild);
pTree->m_pRChild = CreateBiTree(pTree->m_pRChild);
}
return pTree;
}

//先序遍历二叉树
void TraverseTree(BiTree *root)
{
if (NULL != root)
{
cout<<root->m_chValue<<endl;
TraverseTree(root->m_pLChild);
TraverseTree(root->m_pRChild);
}
}

int main()
{
BiTree *root = NULL;
root = CreateBiTree();
TraverseTree(root);
cout<<"2次镜像之后"<<endl;
BSTreeMirrored(root);
NoRecursive(root);
TraverseTree(root);

return 1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐