算法题:二叉树遍历问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hzt12345hf/article/details/79305421

典型的就是已知前序、中序求后序结果
######一般方法:
定义二叉树数据类型,然后通过前序、中序信息递归建立二叉树,然后后序访问输出结果
由于前序遍历的结果按顺序是根->左子树->右子树,所以用一个count变量记录当前设置的是前序第几个“根”节点

#include <iostream>
#include "stdio.h"

using namespace std;

/* 定义树节点数据类型 */
typedef struct node {
	char d;
	node *lchild,*rchild;
}*pTree,TreeNode;

int count; // 先序顺序计数

/* 从后序查找某节点位置并返回 */
int FindChar(char c, char *s2)
{
	for(int i = 0,j = strlen(s2); i<j; i++)
	{
		if(s2[i] == c) return i;
	}
	return 0;
}

/* 建立二叉树 */
void BuildBiTree(pTree &tree,char *s1, char *s2, int m, int n)
{
	if(m<=n)
	{
		tree = new TreeNode;
		tree->lchild = NULL;
		tree->rchild = NULL;
		tree->d = s1[count];
		int t = FindChar(s1[count],s2); // 查找左右子树分割位置
		count++; // 计数+1
		BuildBiTree(tree->lchild,s1,s2,m,t-1); // 递归左子树
		BuildBiTree(tree->rchild,s1,s2,t+1,n); // 递归右子树
	}
}

/* 后序遍历 */
void postOrder(pTree &tree)
{
	if(tree)
	{
		postOrder(tree->lchild);
		postOrder(tree->rchild);
		cout<<tree->d;
	}
}
int main()
{
	char s1[1000];
	char s2[1000];
	while(cin>>s1>>s2)
	{
		pTree tree;
		count = 0;
		BuildBiTree(tree,s1,s2,0,strlen(s1)-1);
		postOrder(tree);
	}
	return 0;
}

######直接求:
根据前序:根->左子树->右子树;中序:左子树->根->右子树;后序:左子树->右子树->根 来递归求出结果
根据后序遍历规则,最后才是根节点,所以count从最后一位开始,向前直到0,而且应该先递归 右子树,在递归 左子树
如下所示
前序 A BCEFD GH
中序 ECFBD A GH
后序结果:EFCDBHGA

第一遍设置了 _______A
——递归右子树-前序 GH 中序 GH
——设置G ______GA
————递归右子树-前序 H 后序 H
————设置H-_____HGA
——递归左子树-前序BCEFD 中序ECFBD
——设置B-____BHGA
————递归右子树-前序D 后序 D
————设置D-___DBHGA
————递归左子树-前序CEF 后序ECF
————设置C-__CDBHGA
——————递归左子树-前序F 后序 F
——————设置F-_FCDBHGA
——————递归右子树-前序E 后序 E
——————设置E-EFCDBHGA
输出结果:EFCDBHGA

#include <iostream>
#include "stdio.h"

using namespace std;

int count; // 后序"根"计数

/* 查找节点位置 */
int FindChar(char c, char *s2)
{
	for(int i = 0,j = strlen(s2); i<j; i++)
	{
		if(s2[i] == c) return i;
	}
	return 0;
}
/* 求后序结果 */
void BuildPostOrder(char *pre, char *in, char *post, int prem, int pren, int inm, int inn)
{
	if(prem<=pren && inm<=inn)
	{
		post[count--] = pre[prem];
		int t = FindChar(pre[prem],in);
		BuildPostOrder(pre,in,post,prem+1+t-inm,pren,t+1,inn); // 递归右子树
		BuildPostOrder(pre,in,post,prem+1,prem+t-inm,inm,t-1); // 递归左子树
	}
}
int main()
{
	char pre[1000];
	char in[1000];
	while(cin>>pre>>in)
	{
		char post[1000];
		memset(post,'\0',1000);
		count = strlen(pre)-1; // 从最后一位开始
		BuildPostOrder(pre,in,post,0,strlen(pre)-1,0,strlen(pre)-1);
		cout<<post<<endl;
	}
	return 0;
}

我的个人主页

猜你喜欢

转载自blog.csdn.net/hzt12345hf/article/details/79305421