hdu 1710 二叉树遍历

本文介绍了一种从给定的二叉树先序和中序遍历序列中求得后序遍历序列的方法。通过递归处理左右子树并利用栈结构实现,最终输出完整的后序遍历序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hdu.edu.cn/showproblem.php?pid=1710

/*
二叉树的遍历:
先序遍历(preorder traversal)
:先遍历父节点,然后是左孩子,右孩子。
中序遍历(inorder traversal):先遍历左孩子,然后是父节点,最后遍历右孩子。
后序遍历(postorder traversal):先遍历左孩子和右孩子,然后遍历父节点。
*/
题目大意:给出一个二叉树的先序和中序遍历序列,求后序遍历序列;
思路:将一棵二叉树分为根节点,左子树,右子树三部分。先让根节点入栈,然后递归处理右子树和左子树(必须先右后左)。最后依次出栈即得到后序遍历序列。
PS:本题解法是在假设所有节点数字不同的条件下进行的,题目并没有给出这个条件,不过能过测试。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stack>
using namespace std;
const int N=1005;
int preorder[N],inorder[N];
stack<int>postorder;
//二叉树由先序序列和中序序列求后序序列
void getpost(int pstart,int pend,int istart,int iend)
{
	int i,j;
	postorder.push(preorder[pstart]);

	for(i=0;i<=iend;i++){  //i表示根节点在中序的位置
		if(inorder[i]==preorder[pstart]) break;
	}
	j=pstart+(i-istart)+1; //j表示先序中左右子树的分界点

	if(j<=pend && i+1<=iend){  //求解右子树
		getpost(j,pend,i+1,iend);
	}
	if(pstart+1<=j-1 && istart<=i-1){  //求解左子树
		getpost(pstart+1,j-1,istart,i-1);
	}
}
int main()
{
	int i,n;
	while(scanf("%d",&n)!=EOF){
		for(i=0;i<n;i++) scanf("%d",&preorder[i]);
		for(i=0;i<n;i++) scanf("%d",&inorder[i]);
		getpost(0,n-1,0,n-1);
		while(!postorder.empty()){
			printf("%d",postorder.top());
			postorder.pop();
			if(!postorder.empty())
				printf(" ");
		}
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值