将一个二叉树镜像

// 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值