重构二叉树

二叉树的重构是十分重要的我们必须要把握(并且能够理解它的过程)
一般题目会告诉你,中序遍历和后序遍历去重构二叉树,或者 先序遍历和中序遍历去重构二叉树。
中序遍历和后序遍历去重构二叉树
在这里插入图片描述

#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
typedef struct BinaryTree
{
	struct BinaryTree *left,*right;
	char data;
}BinTreeNode;
BinTreeNode *CreateTree(BinTreeNode *tree,char *PostOrder,char *InOrder,int length)
{
	int k=0;
	if(length==0) return NULL; 
	while(PostOrder[length-1]!=InOrder[k]) k++;
	if((tree=(BinTreeNode *)malloc(sizeof(BinTreeNode)))==NULL)
	{
		cout<<"分配内存失败"<<endl;
		exit(1); 
	} 
	tree->data=InOrder[k];
	tree->left=CreateTree(tree->left,PostOrder,InOrder,k);//左子树
	tree->right=CreateTree(tree->right,PostOrder+k,InOrder+k+1,length-k-1);//右子树 
	return tree;
} 
void PreOrder(BinTreeNode *tree)
{
	if(tree)
	{
		cout<<tree->data;
		PreOrder(tree->left);
		PreOrder(tree->right);
	}
}
int main()
{
	BinTreeNode *tree=NULL;
	char PostOrder[50];
	char InOrder[50];
	int length;//二叉树的结点为多少个 
	cin>>length; 
	cin>>PostOrder;//后序 
	cin>>InOrder;//中序
	cout<<"先序遍历是:"; 
	tree=CreateTree(tree,PostOrder,InOrder,length);
	PreOrder(tree);
} 

中序和先序重构二叉树
在这里插入图片描述

#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<iostream>
using namespace std;
typedef struct BinaryTree
{
	struct BinaryTree  *left, *right;
	char  data;
}BinTreeNode;
BinTreeNode* CreateTree(BinTreeNode* tree, char * PreOrder, char * InOrder, int length)
{
	int k = 0;
	if (length == 0) return NULL;
	while (PreOrder[0] != InOrder[k]) k++;
	if ((tree = (BinTreeNode*)malloc(sizeof(BinTreeNode))) == NULL)
	{
		cout << "内存分配失败" << endl;
		exit(1);
	}
	tree->data=InOrder[k];
	tree->left = CreateTree(tree->left, PreOrder + 1, InOrder, k);//左子树 
	tree->right = CreateTree(tree->right, PreOrder + k + 1, InOrder + k + 1, length - k - 1);//右子树 
	return  tree;

}
void PostOrder(BinTreeNode *tree)
{
	if(tree)
	{
		PostOrder(tree->left);
		PostOrder(tree->right);
		cout<<tree->data;
	}
} 
int main()
{
	int length;	
	char PreOrder[50];
    char  InOrder[50];
	BinTreeNode *tree = NULL;
	cin >>length;
	cin >> PreOrder;//先序
	cin>> InOrder;//中序 
	tree = CreateTree(tree, PreOrder, InOrder, length);
	cout<<"后序遍历为";
	PostOrder(tree); 
	return 0;
}
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值