• 已知二查树前序遍历和中序遍历求解后序遍历算法实现


    /**
       author : coder_zhang
       time   : 2014-6-14   
    **/
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define    MAX                                   100
    #define    ARRAY_SIZE(array, type)               ((sizeof(array) / sizeof(type)))
    
    typedef struct node {
        int   value;
        struct node* left;
        struct node* right;
    }  node;
    
    /* 非递归后序遍历 */
    void  post_order(node* root) {
        node*  stack[MAX];
        int    status[MAX];
        int    pos = -1;
    
        while (root != NULL) {
            stack[++pos] = root;
            status[pos] = 0;
            root = root->left;
        }
    
        while (pos != -1) {
            root = stack[pos];
    
            if (root->right == NULL || status[pos] == 1) {
                --pos;
                fprintf(stderr, "%c	", root->value);
            }
            else {
                status[pos] = 1;
                root = root->right;
                while (root != NULL) {
                    stack[++pos] = root;
                    status[pos] = 0;
                    root = root->left;
                }
            }
        }
    
        fprintf(stderr, "
    ");
    }
    
    /* 非递归前序遍历 */
    void pre_order_view(node* root) {
        node* stack[MAX];
        int   pos = -1;
    
        while (root != NULL || pos != -1) {
            if (root == NULL) {
                root = stack[pos--];
            }
            
            fprintf(stderr, "%c	", root->value);
    
            if (root->right != NULL) {
                stack[++pos] = root->right;
            }
    
            root = root->left;
        }
    
        fprintf(stderr, "
    ");
    }
    
    void pre_order_view_1(node* root) {
        if (root != NULL) {
            fprintf(stderr, "%c
    ", root->value);
            pre_order_view_1(root->left);
            pre_order_view_1(root->right);
        }
    }
    
    int  index_char(const char* str, char ch) {
        int pos = 0;
        while (*str != '' && *str != ch) {
            ++pos;
            ++str;
        }
    
        return *str == '' ? -1 : pos;
    }
    
    void  create_tree(node** p, char* pre_order, char* in_order, int p_start, int p_end, int i_start, int i_end) {
         if (p_start <= p_end) {
             *p = (node*)malloc(sizeof(node));
             if (*p == NULL) {
                 fprintf(stderr, "malloc memory failed!
    ");
                 exit(1);
             }
             (*p)->value = pre_order[p_start];
             (*p)->left = (*p)->right = NULL;
             int pos = index_char(in_order, pre_order[p_start]);
             if (pos != -1) {
                 int dis = pos - i_start;
    
                 create_tree(&(*p)->left, pre_order, in_order, p_start+1, p_start+dis, i_start, i_start+dis-1);
                 create_tree(&(*p)->right, pre_order, in_order, p_start+dis+1, p_end, pos+1, i_end);
             }
         }
    }
    
    int  main(void) {
        char pre_order[MAX];
        char in_order[MAX];
    
        fprintf(stderr, "input pre order string:");
        fgets(pre_order, MAX, stdin);
        pre_order[strlen(pre_order)-1] = '';
        
        fprintf(stderr, "input in order string:");
        fgets(in_order, MAX, stdin);
        in_order[strlen(in_order)-1] = '';
            
            node* root = NULL;
        create_tree(&root, pre_order, in_order, 0, strlen(pre_order)-1, 0, strlen(in_order)-1);
        
        post_order(root);
        return 0;
    }
  • 相关阅读:
    中文句子相似度之計算與應用
    《The Elder Scrolls V: Skyrim》百般冷门却强力职业
    《老滚5 》买房、娶老婆详尽攻略
    关于组播239.255.255.250
    Windows事件ID大全
    事件查看器常见ID代码解释
    Windows路由表详解
    两种动态加载JavaScript文件的方法
    80后的你们还记得这些游戏吗
    谷歌和HTTPS
  • 原文地址:https://www.cnblogs.com/coder-zhang/p/3788499.html
Copyright © 2020-2023  润新知