已知二叉树前序遍历和中序遍历求后续遍历

c_m_deng 2013-04-27 07:59:14
求实现这样的一个函数void convert(char preorder[], char midorder[], char output[])
已知二叉树前序遍历字符串如“GDAFEMHZ”和中序遍历字符串“ADEFGHMZ”作为函数输入,
将后序遍历结果保存在output中。

求递归和不用递归两种解决方法
...全文
717 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
be_yourself_fan 2013-09-01
  • 打赏
  • 举报
回复 1
前两天刚好看学习了相关知识点,写了代码
#include <stdio.h>
#include <stack>
using namespace std;

void exPrintNum(int num[], int n);
void exPrintNum2(int num[],int i);
void midPrintNum(int num[], int n);
void midPrintNum2(int num[],int i);
void lastPrintNum(int num[], int n);
void lastPrintNum2(int num[], int i);
int main()
{
	int num[401];
	int i;
	for (i=0;i<=400;i++)
		num[i]=(i<=7?i:-1);
	lastPrintNum(num,1);
	printf("\n");
	lastPrintNum2(num,1);
	printf("\n");
	return 0;
}
//递归:模拟二叉树前序遍历
void exPrintNum(int num[], int n)
{
	if (num[n]==-1)
		return;
	printf("%d ",num[n]);
	exPrintNum(num,2*n);
	exPrintNum(num,2*n+1);
}
//迭代:模拟二叉树前序遍历
void exPrintNum2(int num[],int i)
{
	if (num[i]==-1) return;
	stack<int> s;
	while (num[i]!=-1||!s.empty())
	{
		while (num[i]!=-1)
		{
			printf("%d ",num[i]);
			s.push(i);
			i=2*i;
		}
		i=s.top();
		s.pop();
		i=2*i+1;
	}
}

//递归:模拟二叉树中序遍历
void midPrintNum(int num[], int n)
{
	if (num[n]==-1)
		return;
	midPrintNum(num,2*n);
	printf("%d ",num[n]);
	midPrintNum(num,2*n+1);
}
//迭代:模拟二叉树中序遍历
void midPrintNum2(int num[],int i)
{
	if (num[i]==-1) return;
	stack<int> s;
	while (num[i]!=-1||!s.empty())
	{
		while (num[i]!=-1)
		{
			s.push(i);
			i=2*i;
		}
		i=s.top();
		s.pop();
		printf("%d ",num[i]);
		i=2*i+1;
	}
	
}

//递归:模拟二叉树后序遍历
void lastPrintNum(int num[], int n)
{
	if (num[n]==-1)
		return;
	lastPrintNum(num,2*n);
	lastPrintNum(num,2*n+1);
	printf("%d ",num[n]);
}
//迭代:模拟二叉树后序遍历
void lastPrintNum2(int num[],int i)
{
	if (num[i]==-1) return;
	stack<int> s;
	while (num[i]!=-1||!s.empty())
	{
		while (num[i]!=-1||!s.empty())
		{
			while (num[i]!=-1)
			{
				s.push(i);
				i=2*i;
			}
			i=s.top();
			s.pop();
			s.push(i);
			i=2*i+1;
		}
		printf("%d ",num[i]);
	}
}

c_m_deng 2013-08-31
  • 打赏
  • 举报
回复
嗯,这个已经解决了哈,方法思想都是知道的,只是用字符串数组来实现时有些小麻烦,你可以试一试
灵剑 2013-08-31
  • 打赏
  • 举报
回复
这种题很简单啊,先看前序遍历G为第一个所以G为总根节点,再看中序遍历ADEF在G的左边,所以为G的左子树,同理HMZ为G的右子树。再看前序遍历,ADEF中D在最前面,所以D是左子树的根节点。HMZ中M在最前面,所以M为右子树根节点。再看中序遍历,ADEF中A在D的左侧,所以A为D的左子树,EF为D的右子树...同理就可以推出整个树的结构如下图: G / \ D M / \ / \ A F H Z / E 所以后续遍历为:AEFDHZMG

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧