Binary Tree Traversals(二叉树遍历)

二叉树遍历
时间限制:1000 / 1000ms(Java /其他)内存限制:32768 / 32768K(Java /其他)
提交总数:11接受提交:2
问题描述
二叉树是一组有限的顶点,这些顶点为空或由根r和两个不相交的二叉树组成,分别称为左子树和右子树。有两种最重要的方法可以对二叉树的顶点进行系统遍历或排序。它们是预购,订购和后购。令T为具有根r和子树T1,T2的二叉树。

在T的顶点的遍历遍历中,我们访问根r,然后按顺序访问T1的顶点,然后按顺序访问T2的顶点。

在T的顶点的有序遍历中,我们按顺序访问T1的顶点,然后依次访问根r和按顺序访问T2的顶点。

在对T的顶点进行后遍历时,我们先访问T1的顶点,然后再访问T2的顶点,最后访问r。

现在,您将获得某个二叉树的预排序序列和有序序列。尝试找出其后置顺序。

输入项
输入包含几个测试用例。每个测试用例的第一行包含一个整数n(1 <= n <= 1000),即二进制树的顶点数。后接两行,分别指示预排序序列和有序序列。您可以假设它们始终对应于排他的二叉树。

输出量
对于每个测试用例,请打印一行以指定相应的后置顺序。

样本输入
9
1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6

样本输出
7 4 2 8 9 5 6 3 1

资源
HDU 2007春季编程竞赛

代码:

#include<iostream>
#include<cstdio>
#include<vector>

using namespace std;
typedef struct BiTNode
{
	struct BiTNode *lchild;
	struct BiTNode *rchild;
	int data;
}BiTNode, *BiTree;
vector<int> q;
BiTree creatTree(int *in, int *pre, int n)
{
	if(n <= 0)
		return NULL;
	else
    {
		BiTree T = new BiTNode();
		T->data = pre[0];
		int i;
		for(i = 0; i < n; i++)
        {
			if(pre[0] == in[i])
				break;
		}
		T->lchild = creatTree(in, pre + 1, i);
		T->rchild = creatTree(in + i + 1, pre + i + 1, n - i - 1);
		return T;
	}
}


void postorderTraversal(BiTree BT)
{
	if(BT)
    {
		postorderTraversal(BT->lchild);
		postorderTraversal(BT->rchild);
		//cout<<BT->data<<" ";
        q.push_back(BT->data);
	}
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
    {
        q.clear();
        int in[10000];
        int pre[10000];
        BiTree T;
        for(int i = 0; i < n; i++)
        {
                cin >> pre[i];
        }
        for(int i = 0; i < n; i++)
        {
                cin >> in[i];
        }
        T = creatTree(in, pre, n);
        postorderTraversal(T);
        for(int i=0;i<q.size();i++){
            cout<<q[i];
            if(i!=q.size()-1)cout<<" ";
        }
        cout<<endl;
    }
	return 0;
}

发布了67 篇原创文章 · 获赞 2 · 访问量 1869

猜你喜欢

转载自blog.csdn.net/weixin_44641254/article/details/102876682
今日推荐