HRBUST 2040 二叉树的遍历

Posted 8023spz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HRBUST 2040 二叉树的遍历相关的知识,希望对你有一定的参考价值。

给出一棵二叉树的中序和前序遍历,输出它的后序遍历。
Input

本题有多组数据,输入处理到文件结束。

每组数据的第一行包括一个整数n,表示这棵二叉树一共有n个节点。

接下来的一行每行包括n个整数,表示这棵树的中序遍历。

接下来的一行每行包括n个整数,表示这棵树的前序遍历。

3<= n <= 100

Output
每组输出包括一行,表示这棵树的后序遍历。
Sample Input
7
4 2 5 1 6 3 7

1 2 4 5 3 6 7

 

Sample Output
4 5 2 6 7 3 1 
 
这里后序遍历写了一个非递归,嗯,为考研做准备。
代码:
#include <stdio.h>
#include <stdlib.h>
typedef struct Node 
    int Data;
    struct Node *Left,*Right;
Node;
int q[100],z[100];///q记录前序遍历 z记录中序遍历
Node* creatNode() 
    Node *node = (Node *)malloc(sizeof(Node));
    if(node == NULL) exit(0);
    node -> Left = node -> Right = NULL;
    return node;

Node* rTree(int q1,int q2,int z1,int z2) 
    Node *node = creatNode();
    node -> Data = q[q1];
    for(int i = z1;i <= z2;i ++) 
        if(z[i] == q[q1]) 
            if(i != z1) node -> Left = rTree(q1 + 1,q1 + i - z1,z1,i - 1);
            if(i != z2) node -> Right = rTree(q1 + i - z1 + 1,q2,i + 1,z2);//右儿子构建
            break;
        
    
    return node;

//void postOrder(Node *node) 
//    if(node == NULL) return;
//    postOrder(node -> Left);
//    postOrder(node -> Right);
//    printf("%d ",node -> Data);
//
void postOrder(Node *node) 
    Node *s[100];
    char num[100] = 0;
    int c = 0;
    s[c ++] = node;
    while(c) 
        Node *temp = s[c - 1];
        if(num[c - 1]) 
            num[c - 1] = 0;
            printf("%d ",s[-- c] -> Data);
        
        else 
            num[c - 1] = 1;
            if(temp -> Right) 
                s[c ++] = temp -> Right;
            
            if(temp -> Left) 
                s[c ++] = temp -> Left;
            
        
    

int main() 
    int n;
    Node *tree;
    while(~scanf("%d",&n)) 
        for(int i = 0;i < n;i ++) 
            scanf("%d",&z[i]);
        
        for(int i = 0;i < n;i ++) 
            scanf("%d",&q[i]);
        
        tree = rTree(0,n - 1,0,n - 1);
        postOrder(tree);
        putchar(\n);
    
    return 0;

 

以上是关于HRBUST 2040 二叉树的遍历的主要内容,如果未能解决你的问题,请参考以下文章

[数据结构]——二叉树(二叉树的分类和二叉树的遍历)

二叉树的后续遍历是啥意思啊?

二叉树的遍历

为啥树的后根遍历对应二叉树的中序遍历

二叉树 详解

图解 二叉树的四种遍历