C 数据结构之二叉树的遍历

二叉树的遍历

//根据前序中序遍历确定后序遍历,输入:两个字符串,长度n小于等于26。第一行前序,第二行中序,节点以大写字母命名,输出后序遍历字符串

/*
输入ABC BAC 输出BCA
输入FDXEAG XDEFAG 输出XEDGAF
该例设计二叉树的建立,两种二叉树遍历结果还原二叉树 。 
*/ 

//多输出一个空格 

思路:该例子设计二叉树的建立,由两种二叉树的遍历结果还原二叉树以及二叉树的遍历。由前序遍历的首字母可知二叉树的根节点,在中序遍历中搜索该根节点,其左侧为其左子树,其右为其右子树,依此对前序遍历结果进行分割,对其左子树部分的首字母为其左子树的根节点,依次类推循环往复,即可还原二叉树。代码及具体步骤如下:

#include<stdio.h>
#include<string.h>
struct Node{
	Node *lchild;
	Node *rchild;
	char c;
}Tree[50];

int loc;//静态数组中已经分配的节点个数
Node *creat(){//申请一个节点空间,返回指向其的指针 
	Tree[loc].lchild=Tree[loc].rchild=NULL;
	return &Tree[loc++];//返回指针,且loc累加 
} 
char str1[30] ,str2[30];

void postOrder(Node *T)//后序遍历 
{
	if (T->lchild!=NULL)//若左子树不为空,遍历左子树 
	{
		postOrder(T->lchild);
	}
	if(T->rchild!=NULL)//若右子树不为空,遍历右子树 
	{
		postOrder(T->rchild); 
	}
	printf("%c",T->c);//遍历该节点,输出字符信息 
}

Node *build(int s1,int e1,int s2,int e2) 
{//由字符串的前序遍历和中序遍历还原树,并返回其根节点,其中前序遍历结果由str1[s1]到strs[e1]
//中序为str2[s2到e2] 
	Node* ret=creat();//申请节点 
	ret->c=str1[s1]; //该节点字符为前序遍历的第一个字符 
	int rootIdx;
	for(int i=s2 ;i<=e2;i++)//查找根节点字符在中序遍历过程中的位置 
	{
		if(str2[i]==str1[s1])
		{
			rootIdx=i;
			break;
		}
	}
	if(rootIdx!=s2)//若左子树不为空 
	{
		ret->lchild=build( s1+1, s1+(rootIdx-s2),s2,rootIdx-1);
		
	}//递归还原其左子树 
		if(rootIdx!=e2)//若右子树不为空 
	{
		ret->rchild=build(s1+(rootIdx-s2)+1,e1,rootIdx+1,e2 );
		
	}//递归还原其右子树 
	return ret;
}
int main()
{
	while(scanf("%s",str1)!=EOF)
	{
		scanf("%s",str2);
		loc=0;//初始化静态内存空间中已使用的节点个数为0 
		int L1=strlen(str1);
		int L2=strlen(str2);
		Node *T=build(0,L1,0,L2);//还原整棵树,其根节点指针保存在T中 
		postOrder(T);//后序遍历 
		printf("\n");//换行输出 
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/joanna_or_zhouzhou/article/details/80348922