// test.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
typedef struct BTreeNode
{
char Value;
BTreeNode* Left;
BTreeNode* Right;
}BTreeNode;
void Visit(BTreeNode* Root)
{
cout<<Root->Value<<" ";
}
void BTreeReverse(BTreeNode* &Root)
{
if(Root==NULL)
return;
if(Root->Left!=NULL||Root->Right!=NULL)
{
BTreeNode* Temp;
Temp=Root->Left;
Root->Left=Root->Right;
Root->Right=Temp;
}
BTreeReverse(Root->Left);
BTreeReverse(Root->Right);
}
void PreOrder(BTreeNode* Root)
{
if(Root==NULL)
return;
Visit(Root);
PreOrder(Root->Left);
PreOrder(Root->Right);
}
void InOrder(BTreeNode* Root)
{
if(Root==NULL)
return;
InOrder(Root->Left);
Visit(Root);
InOrder(Root->Right);
}
void PostOrder(BTreeNode* Root)
{
if(Root==NULL)
return;
PostOrder(Root->Left);
PostOrder(Root->Right);
Visit(Root);
}
void FreeTree(BTreeNode* root)
{
if(root!=NULL)
{
FreeTree(root->Left);
FreeTree(root->Right);
free(root); //当左右子结点都为空时,调用free,释放空间
}
}
bool IfBtree(string preorder,string inorder)
{
int position;
bool l;
bool r;
if(preorder.empty())
return true;
position=inorder.find(preorder[0]);
if(position!=string::npos)
{
l=IfBtree(preorder.substr(1,position),inorder.substr(0,position));
r=IfBtree(preorder.substr(1+position),inorder.substr(1+position));
}
else
{
return false;
}
return 1&&r;
}
BTreeNode* CreatBTreeNode(string preorder,string inorder)
{
if(preorder.empty())
{
return NULL;
}
if(preorder.length()!=inorder.length())
{
cout<<"不能构成二叉树"<<endl;
return NULL;
}
if(IfBtree(preorder,inorder)==false)
{
cout<<"不能构成二叉树"<<endl;
return NULL;
}
BTreeNode* Root;
int position;
Root=new BTreeNode;
Root->Value=preorder[0];
position=inorder.find(Root->Value);
Root->Left=CreatBTreeNode(preorder.substr(1,position),inorder.substr(0,position));
Root->Right=CreatBTreeNode(preorder.substr(1+position),inorder.substr(1+position));
return Root;
}
int _tmain(int argc, _TCHAR* argv[])
{
BTreeNode* Root=NULL;
string preorder,inorder;
while(cin>>preorder>>inorder)
{
Root=CreatBTreeNode(preorder,inorder);
if(Root!=NULL)
{
PostOrder(Root);
cout<<endl;
BTreeReverse(Root);
PostOrder(Root);
PreOrder(Root);
cout<<endl;
FreeTree(Root);
}
}
system("pause");
return 0;
}
将一个二叉树镜像
最新推荐文章于 2020-09-17 16:49:55 发布