zoukankan      html  css  js  c++  java
  • 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;
    //            }
    //        }
    //    }
    //}
    void postOrder(Node *node) {///前驱结点判断
        Node *s[100],*la;
        int c = 0;
        s[c ++] = node;
        while(c) {
            Node *temp = s[c - 1];
            if(temp -> Left == temp -> Right && temp -> Left == NULL || la == temp -> Left || la == temp -> Right) {
                printf("%d ",s[-- c] -> Data);
                la = temp;
            }
            else {
                if(temp -> Right && la != temp -> Right) {
                    s[c ++] = temp -> Right;
                }
                if(temp -> Left && la != 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('
    ');
        }
        return 0;
    }
  • 相关阅读:
    jQuery 简单滑动轮播图效果
    西工大:同学你好,回来挂科!
    【入门】产品经理零基础怎么入门?
    【考点】 HashMap,HashTable,CurrentHashMap,LinkedHashMap,TreeMap简述
    P图鬼才们集体上线!高校毕业照P图哪家强?
    【实战】怎样实现前端裁剪上传图片功能
    校招选产品经理岗?给你浇盆水
    战胜70%对手的校招开发岗简历是这个样子的
    两个人遇到熊,装死的和转身跑的,哪个能活下来
    第一份实习工作,我应该学到什么?
  • 原文地址:https://www.cnblogs.com/8023spz/p/7240260.html
Copyright © 2011-2022 走看看