二叉树的前中后序的递归、非递归遍历

来源:互联网 发布:ge fanuc plc编程软件 编辑:程序博客网 时间:2024/05/01 02:49

C 代码

#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define STACKSIZE 50/* *  定义二叉树结点以及二叉树的结构 */typedef struct BiTreeNode_{    char data;    struct BiTreeNode_ *left;    struct BiTreeNode_ *right;}BiTreeNode;typedef struct BiTree_{    int size;    BiTreeNode *root;}BiTree;/* *  定义栈的结构 */typedef struct Stack_{    BiTreeNode * base[STACKSIZE];    int top;    int stacksize;}Stack;void stack_init(Stack *stack){    stack->top = -1;    stack->stacksize = 0;}void push(Stack *stack, BiTreeNode *node){    if (stack->stacksize == STACKSIZE)        exit(-1);    stack->base[++stack->top] = node;    stack->stacksize++;}int stack_empty(Stack *stack){    if ((-1 == stack->top) && (0 == stack->stacksize))        return 1;    else        return 0;}BiTreeNode* pop(Stack *stack){    if (stack->top < 0)        exit(-1);    else    {        stack->stacksize--;        return stack->base[stack->top--];    }}BiTreeNode* get_stack_top(Stack *stack){    if (stack->top < 0)        exit(-1);    return stack->base[stack->top];}void bitree_init(BiTree *tree){    tree->size = 0;    tree->root = NULL;}//给树tree的某个结点node插入数据域为data的左子树int bitree_ins_left(BiTree *tree, BiTreeNode *node, const char data){    BiTreeNode *new_node, **position;    if (NULL == node)    {        if (tree->size > 0)            return -1;        position = &tree->root;    }    else    {        if (node->left != NULL)            return -1;        position = &node->left;    }    if (NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))))        return -1;    new_node->data = data;    new_node->left = NULL;    new_node->right = NULL;    *position = new_node;    tree->size++;    return 0;}//给树tree的某个结点node插入数据域为data的右子树int bitree_ins_right(BiTree *tree, BiTreeNode *node, const char data){    BiTreeNode *new_node, **position;    if (NULL == node)    {        if (tree->size > 0)            return -1;        position = &tree->root;    }    else    {        if (node->right != NULL)            return -1;        position = &node->right;    }    if (NULL == (new_node = (BiTreeNode *)malloc(sizeof(BiTreeNode))))        return -1;    new_node->data = data;    new_node->left = NULL;    new_node->right = NULL;    *position = new_node;    tree->size++;    return 0;}// 先序遍历函数void pre_order(const BiTreeNode *node){    if (node)    {        printf("%c", node->data);        pre_order(node->left);        pre_order(node->right);    }}// 中序遍历函数void in_order(const BiTreeNode *node){    if (node)    {        in_order(node->left);        printf("%c", node->data);        in_order(node->right);    }}// 后序遍历函数void end_order(const BiTreeNode *node){    if (node)    {        end_order(node->left);        end_order(node->right);        printf("%c", node->data);    }}// 先序遍历函数(非递归void pre_order_norec(const BiTreeNode *node){    Stack stack;    stack_init(&stack);    push(&stack, node);    while (stack.stacksize != 0)    {        BiTreeNode *p = pop(&stack);        if (p == NULL)        {            putchar(' ');        }        else        {            printf("%c", p->data);            push(&stack, p->right);            push(&stack, p->left);        }    }}// 中序遍历函数(非递归void in_order_norec(const BiTreeNode *node){    Stack stack;    stack_init(&stack);    push(&stack, node);    while (stack.stacksize != 0)    {        BiTreeNode *p = pop(&stack);        while (p->left)        {            push(&stack, p);            p = p->left;        }        putchar(' ');        printf("%c", p->data);        if (p->right)        {            push(&stack, p);            push(&stack, p->right);        }        else        {            putchar(' ');            while (stack.stacksize != 0)            {                BiTreeNode *from = pop(&stack);                if (from->left == p)                {                    printf("%c", from->data);                    push(&stack, from);                    if (from->right)                    {                        push(&stack, from->right);                        break;                    }                    else                    {                        putchar(' ');                        p = from;                    }                }                else                {                    p = from;                }            }        }    }}// 后序遍历函数(非递归void end_order_norec(const BiTreeNode *node){}int main(){    char data;    Stack stack;    BiTree tree;    BiTreeNode *node;    stack_init(&stack);    bitree_init(&tree);    printf("请以先序顺序输入结点值: \n");    data = getchar();    if (0 == tree.size)    {        if (' ' == data)            return -1;        bitree_ins_left(&tree, NULL, data);        push(&stack, tree.root);    }    while (!stack_empty(&stack))    {        data = getchar();        if (' ' == data)        {            node = pop(&stack);            if (NULL == node->left)            {                data = getchar();                if (' ' != data)                {                    bitree_ins_right(&tree, node, data);                    push(&stack, node->right);                }            }        }        else        {            node = get_stack_top(&stack);            if (NULL == node->left)            {                bitree_ins_left(&tree, node, data);                push(&stack, node->left);            }            else            {                node = pop(&stack);                bitree_ins_right(&tree, node, data);                push(&stack, node->right);            }        }    }    printf("-----先序递归遍历二叉树-----\n");    pre_order(tree.root);    putchar('\n');    printf("-----中序递归遍历二叉树-----\n");    in_order(tree.root);    putchar('\n');    printf("-----后序递归遍历二叉树-----\n");    end_order(tree.root);    putchar('\n');    printf("-----先序非递归遍历二叉树-----\n");    pre_order_norec(tree.root);    putchar('\n');    printf("-----中序非递归遍历二叉树-----\n");    in_order_norec(tree.root);    putchar('\n');    printf("-----后序非递归遍历二叉树-----\n");    end_order_norec(tree.root);    putchar('\n');    return 0;}
原创粉丝点击