关闭

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

标签: nulldeletestructc
3095人阅读 评论(1) 收藏 举报
分类:

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

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


7
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4219591次
    • 积分:34159
    • 等级:
    • 排名:第136名
    • 原创:254篇
    • 转载:8篇
    • 译文:0篇
    • 评论:2659条
    博客专栏
    最新评论