Live2D

【王道例3.4】通过二叉树遍历结果建立二叉树

题目

思路

根据先序遍历可以知道第一个字符一定是根节点,然后在中序遍历中,找到对应的根节点,则其左边的字母组成了左子树,右边的字母组成了右子树。
例如示例中:

代码

#include<bits/stdc++.h> 
using namespace std;
typedef struct BiNode{
	struct BiNode *lchild;
	struct BiNode *rchild;
	char data;
}*BiTree;
string s1,s2;      //s1存储前序遍历,s2存储中序遍历 
int cen=0; 

//分析s2 p~q段,s1 a~b段 建立二叉树T
void BuildTree(BiTree &T,int p,int q,int a,int b)
{
	T=(BiTree)malloc(sizeof(BiNode));
	T->data=s1[a];                      //先序第一个一定为此时的根节点
	T->lchild=T->rchild=NULL;
	
	int loc;
	for(int i=p;i<=q;i++)              //找出跟结点在中序遍历的位置,将左右子树隔开
	{
		if(T->data==s2[i])
		{
			loc=i;
			break;
		}
	}
	if(loc!=p)       //左子树存在
	{
		BuildTree(T->lchild,p,loc-1,a+1,a+(loc-p));      //loc-p为左边字符串的宽度
	} 
	if(loc!=q)      //右子树存在 
	{
		BuildTree(T->rchild,loc+1,q,a+(loc-p)+1,b);
	}
}

void PostOrderTraverse(BiTree T)
{
	if(!T)
		return;
	else if(T!=NULL)
	{
		if(T->lchild!=NULL)
		PostOrderTraverse(T->lchild);
		if(T->rchild!=NULL)
		PostOrderTraverse(T->rchild);
		
		cout<<(T->data);
	}
}
int main()
{
	int p,q,loc;
	cin>>s1>>s2;
	BiTree T;
	/*T=(BiTree) malloc(sizeof(BiNode));
	T->data=s1[0];
	*/

	p=0;
	q=s2.size();
	BuildTree(T,p,q-1,p,q-1);      //p为第一个字母下标,q为最后一个
	PostOrderTraverse(T);
	cout<<endl;
	return 0;
}
posted @ 2020-02-25 17:13  WSquareJ  阅读(188)  评论(0编辑  收藏  举报