HDU1710——Binary Tree Traversals(二叉树)

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


这是一道二叉树的建立与遍历的题目。

题意是给你先序和中的排列,输出后序排列。


首先介绍一下二叉树的三种遍历方式:

先序遍历:对于每个节点按照 父节点>左节点>右节点的顺序遍历。

中序遍历:对于每个节点按照 左节点>父节点>右节点的顺序遍历。

后序遍历:对于每个节点按照 左节点>右节点>父节点的顺序遍历。

因为是第一次写二叉树,所以还是有些虚。而且二叉树很多时候要用到递归进行操作,总觉得递归这玩意技巧性很强,不好掌控。

但是写起来还是比较顺利的,关键是理解他们之间的关系,尽管开始建树的时候递归边界没有处理好,但是很快还是被我发现了。

当然还有就是要注意输出的格式,最后一个数字不要加空格,由于被这一点坑过很多次,所以这次没有被坑。

最终1Y,心情舒畅。


这道题肯定有更加数学的方法,但是由于第一次做二叉树,所以就先用模拟吧。


#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;
int a[1005],b[1005],n;
int now_root;
struct tree
{
    int x;
    tree *child1,*child2;
};
void build(tree *fa,int l,int r)
{
    int mid;
    
    if(now_root==n) return;
    
    for(mid=0; mid<n; mid++)
        if(b[mid]==a[now_root]) break;

    fa->x=a[now_root++];

    if(mid!=l)
    {
        fa->child1=new tree;
        build(fa->child1,l,mid);
    }
    else fa->child1=NULL;

    if(mid!=r-1)
    {
        fa->child2=new tree;
        build(fa->child2,mid+1,r);
    }
    else fa->child2=NULL;

}
void dfs(tree *fa)
{
    if(fa)
    {
        dfs(fa->child1);
        dfs(fa->child2);
        printf("%d",fa->x);
        if(fa->x!=a[0]) printf(" ");
    }
}
int main()
{
    tree *root;
    root=new tree;
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        now_root=0;
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(i=0; i<n; i++)
            scanf("%d",&b[i]);
        root=new tree;
        build(root,0,n);
        dfs(root);
        printf("\n");
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值