根据树的两种遍历序列求第三种遍历序列

只知道先序序列和后序序列是无法求出唯一的树,所以不做讨论。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

struct BinaryTreeNode
{
	char c;
	BinaryTreeNode *lchild, *rchild;
	BinaryTreeNode()
	{
		lchild = NULL, rchild = NULL;
	}
};
struct BinaryTreeNode *root1,*root2;

char preorder[100], inorder[100], postorder[100];

void preSearch(BinaryTreeNode *root)   //先序遍历树
{
	if(root != NULL)
	{
		printf("%c", root->c);
		preSearch(root->lchild);
		preSearch(root->rchild);
	}
	return ;
}

void midSearch(BinaryTreeNode *root)   //中序遍历树
{
	if(root != NULL)
	{
		midSearch(root->lchild);
		printf("%c", root->c);
		midSearch(root->rchild);
	}
	return ;
}

void postSearch(BinaryTreeNode *root)  //后序遍历树
{
	if(root != NULL)
	{
		postSearch(root->lchild);
		postSearch(root->rchild);
		printf("%c", root->c);
	}
	return ;
}

void BuildTreeFromPreAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根据中序和先序求树
{
	root = new BinaryTreeNode();
	root->c = *(preorder + now);
	int pos = (int)(strchr(inorder, *(preorder + now)) - inorder); //查找字符串中首次出现某个字符的位置 
	now++;
	if(now >= len)
		return ;
	if(pos - 1 >= ll)
	{
		BinaryTreeNode *t = new BinaryTreeNode();
		root->lchild = t;
		BuildTreeFromPreAndMid(root->lchild, ll, pos - 1, len, now);
	}
	if(pos + 1 <= lr)
	{
		BinaryTreeNode *t = new BinaryTreeNode();
		root->rchild = t;
		BuildTreeFromPreAndMid(root->rchild, pos + 1, lr, len, now);
	}
}

void BuildTreeFromPostAndMid(BinaryTreeNode * &root, int ll, int lr, int len, int &now)//根据中序和后序求树
{
	root = new BinaryTreeNode();
	root->c = *(postorder + now);
	int pos = (int)(strchr(inorder, *(postorder + now)) - inorder);
	now--;
	if(now < 0)
		return ;
	if(pos + 1 <= lr)
	{
		BinaryTreeNode *t = new BinaryTreeNode();
		root->rchild = t;
		BuildTreeFromPostAndMid(root->rchild, pos + 1, lr, len, now);
	}
	if(pos - 1 >= ll)
	{
		BinaryTreeNode *t = new BinaryTreeNode();
		root->lchild = t;
		BuildTreeFromPostAndMid(root->lchild, ll, pos - 1, len, now);
	}
}

//释放二叉树
inline void DeleteBinaryTree(BinaryTreeNode * &root)
{
	if(root)
	{
		DeleteBinaryTree(root->lchild);    //释放左子树
		DeleteBinaryTree(root->rchild);    //释放右子树
		delete root;          //释放根结点
	}
}

int main(void)
{
	gets(preorder);
	gets(inorder);
	//gets(postorder);
	int now = 0;
	BuildTreeFromPreAndMid(root1, 0, strlen(preorder) - 1, strlen(preorder), now);

	//int now2 = strlen(postorder)-1;
	//BuildTreeFromPostAndMid(root2, 0, strlen(postorder) - 1, strlen(postorder), now2);

	postSearch(root1);
	puts("");
	DeleteBinaryTree(root1);
	/*preSearch(root2);
	puts("");
	DeleteBinaryTree(root2);*/
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值