zoukankan      html  css  js  c++  java
  • 二叉树的非递归建立

    1. 问题描述:

    先序非递归建立一颗以二叉链表为存储结构的二叉树。例如建立如下所示的一颗二叉树

                                     A

                                 /        

                             B             E

                          /              /      

                       C        D   F        

    则输入应为: ABC_ _D_ _EF_ _ _      (其中_代表空格).

    /*
     *  名 称: 建立二叉树(非递归)
     *  作 者: Brooke gao
     *  时 间: 2013/8/21
     *  
    */
        
    #include<stdio.h>
    #include<stdlib.h>
    #include<malloc.h>
    
    #define STACKSIZE 50
    #define bitree_size(tree)  ((tree)->size)   
    #define bitree_root(tree)  ((tree)->root)
    #define bitree_left(node)  ((node)->left)
    #define bitree_right(node) ((node)->right)
    
    /*
     *  定义二叉树结点以及二叉树的结构
     *
    */
    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(bitree_size(tree) > 0)
                return -1;
            position = &tree->root;
        }
        else
        {
            if(bitree_left(node) != 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(bitree_size(tree) > 0)
                return -1;
    
            position = &tree->root;
        }
        else
        {
            if(bitree_right(node) != 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);
        }
    }
    
    int main()
    {
        char data;
        Stack stack;
        BiTree tree;
        BiTreeNode *node;
        
        stack_init(&stack);
        bitree_init(&tree);
    
        printf("请以先序顺序输入结点值: 
    ");
    
        data = getchar();
        
        if( 0 == bitree_size(&tree) )
        {
            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("-----先序遍历二叉树-----
    ");
        pre_order(tree.root);
        putchar('
    ');
        
        printf("-----中序遍历二叉树-----
    ");
        in_order(tree.root);
        putchar('
    ');
    
        printf("-----后序遍历二叉树-----
    ");
        end_order(tree.root);
        putchar('
    ');
    
        return 0;
    }

  • 相关阅读:
    云图小助理
    ping包的checksum校验和
    ftp相关
    初始化字符串
    安全的域名解析
    10进制转62进制
    centos6一键安装WordPress
    CEF3编译
    一次性生产KEY
    linux系统问题排查
  • 原文地址:https://www.cnblogs.com/yyxayz/p/4027539.html
Copyright © 2011-2022 走看看