Chinaunix首页 | 论坛 | 博客
  • 博客访问: 617451
  • 博文数量: 172
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 1252
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-29 22:26
文章分类

全部博文(172)

文章存档

2011年(6)

2010年(7)

2009年(159)

我的朋友

分类: LINUX

2009-12-20 19:48:10

 

递归遍历:前序、中序、后序

非递归遍历:前序、中序、后序、层序

分治法:计算节点数、计算层高、构造联赛

#include <stdio.h>
#include <stdlib.h>

#define MAX_NODE 100
//--------------------------------------------------------------------------------

struct tree_node_t
{
    char item;
    struct tree_node_t *l;
    struct tree_node_t *r;
};


struct tree_node_t* tree_init(void)
{
    struct tree_node_t *root = malloc(sizeof(struct tree_node_t) * MAX_NODE);
    struct tree_node_t *p;
    
    p = root + 0;
    p->item = 'a';
    p->l = root + 1;
    p->r = root + 2;

    p = root + 1;
    p->item = 'b';
    p->l = root + 3;
    p->r = root + 4;

    p = root + 2;
    p->item = 'c';
    p->l = root + 5;
    p->r = root + 6;

    p = root + 3;
    p->item = 'd';
    p->l = NULL;
    p->r = NULL;

    p = root + 4;
    p->item = 'e';
    p->l = NULL;
    p->r = NULL;

    p = root + 5;
    p->item = 'f';
    p->l = NULL;
    p->r = NULL;

    p = root + 6;
    p->item = 'g';
    p->l = NULL;
    p->r = NULL;

    return root;
}

void tree_free(struct tree_node_t *p)
{
    free(p);
}

void tree_visit(struct tree_node_t *p)
{
    printf("%c \n", p->item);
}

void tree_pre1(struct tree_node_t *p)
{
    tree_visit(p);
    if(p->l != NULL) tree_pre1(p->l);
    if(p->r != NULL) tree_pre1(p->r);
}

void tree_in1(struct tree_node_t *p)
{
    if(p->l != NULL) tree_in1(p->l);
    tree_visit(p);
    if(p->r != NULL) tree_in1(p->r);
}

void tree_post1(struct tree_node_t *p)
{

    if(p->l != NULL) tree_post1(p->l);
    if(p->r != NULL) tree_post1(p->r);
    tree_visit(p);
}

//--------------------------------------------------------------------------------

#define ITEM 1
#define TREE 2
struct m_node_t
{
    struct node_t
    {
        char item;
        struct tree_node_t *link;
    }node;
    int type;
};

struct m_node_t *top, *bottom, *cur;

void stack_init(void)
{
    top = malloc(sizeof(struct m_node_t) * MAX_NODE);
    bottom = cur = top + MAX_NODE -1;
}

void stack_free(void)
{
    free(top);
}

void stack_push(struct tree_node_t *p, int type)
{
    if(type == ITEM)
    {
        cur->node.item = p->item;
    }
    else
    {
        cur->node.item = p->item;
        cur->node.link = p;
    }
    cur->type = type;
    cur--;
}

int stack_pop(struct tree_node_t **p)
{
    static struct tree_node_t node;

    cur++;
    if(cur->type == ITEM)
    {
        node.item = cur->node.item;
        *p = &node;
        return ITEM;
    }
    else
    {
        *p = cur->node.link;
        return TREE;
    }
}

int stack_empty(void)
{
    return (bottom == cur)? 1:0;
}

int stack_print(void)
{
    struct m_node_t *p = cur;

    printf(" stack:");

    while(p++ != bottom)
    {
        if(p->type == ITEM)
        {
            printf(" %c ", p->node.item);
        }
        else
        {
            printf("(%c) ", p->node.link->item);
        }
    }

    printf("\n");
}

void tree_pre2(struct tree_node_t *root)
{
    struct tree_node_t *p = root;

    stack_push(p, TREE);

    while(!stack_empty())
    {
        if(stack_pop(&p) == ITEM)
        {
            tree_visit(p);
        }
        else
        {
            if(p->r != NULL)stack_push(p->r, TREE);
            if(p->l != NULL)stack_push(p->l, TREE);
            stack_push(p, ITEM);
        }
        stack_print();
    }
}

void tree_in2(struct tree_node_t *root)
{
    struct tree_node_t *p = root;

    stack_push(p, TREE);

    while(!stack_empty())
    {
        if(stack_pop(&p) == ITEM)
        {
            tree_visit(p);
        }
        else
        {
            if(p->r != NULL)stack_push(p->r, TREE);
            stack_push(p, ITEM);
            if(p->l != NULL)stack_push(p->l, TREE);

        }
        stack_print();
    }
}

void tree_post2(struct tree_node_t *root)
{
    struct tree_node_t *p = root;

    stack_push(p, TREE);

    while(!stack_empty())
    {
        if(stack_pop(&p) == ITEM)
        {
            tree_visit(p);
        }
        else
        {
            stack_push(p, ITEM);
            if(p->r != NULL)stack_push(p->r, TREE);
            if(p->l != NULL)stack_push(p->l, TREE);
        }
        stack_print();
    }
}

//--------------------------------------------------------------------------------

struct m_node_t *q_top, *q_bottom, *q_put, *q_get;

void queue_init(void)
{
    q_top = malloc(sizeof(struct m_node_t) * MAX_NODE);
    q_bottom = q_put = q_get = q_top + MAX_NODE -1;
}

void queue_free(void)
{
    free(q_top);
}

void queue_put(struct tree_node_t *p, int type)
{
    if(type == ITEM)
    {
        q_put->node.item = p->item;
    }
    else
    {
        q_put->node.item = p->item;
        q_put->node.link = p;
    }
    q_put->type = type;

    if(q_put == q_top)
    {
        q_put = q_bottom;
    }
    else
    {
        q_put--;
    }
}

int queue_get(struct tree_node_t **p)
{
    static struct tree_node_t q_node;
    int ret;

    if(q_get->type == ITEM)
    {
        q_node.item = q_get->node.item;
        *p = &q_node;
        ret = ITEM;
    }
    else
    {
        *p = q_get->node.link;
        ret = TREE;
    }

    if(q_get == q_top)
    {
        q_get = q_bottom;
    }
    else
    {
        q_get--;
    }
    return ret;

}

int queue_empty(void)
{
    return (q_put == q_get)? 1:0;
}

int queue_print(void)
{
    struct m_node_t *p = q_get;

    printf(" queue:");

    while(p != q_put)
    {
        if(p->type == ITEM)
        {
            printf(" %c ", p->node.item);
        }
        else
        {
            printf("(%c) ", p->node.link->item);
        }

        if(p == q_top)
        {
            p = q_bottom;
        }
        else
        {
            p--;
        }
    }

    printf("\n");
}

void tree_level(struct tree_node_t *root)
{
    struct tree_node_t *p = root;

    queue_put(p, TREE);

    while(!queue_empty())
    {
        if(queue_get(&p) == ITEM)
        {
            tree_visit(p);
        }
        else
        {
            queue_put(p, ITEM);
            if(p->l != NULL)queue_put(p->l, TREE);
            if(p->r != NULL)queue_put(p->r, TREE);
        }
        queue_print();
    }
}

//--------------------------------------------------------------------------------

int tree_node_count(struct tree_node_t *root)
{
    int n;
    if(root == NULL) return 0;

    n = tree_node_count(root->l) + tree_node_count(root->r) + 1;

    return n;
}

//--------------------------------------------------------------------------------

int tree_node_heigh(struct tree_node_t *root)
{
    int n;
    int nl,nr;
    
    if(root == NULL) return 0;

    nl = tree_node_heigh(root->l);
    nr = tree_node_heigh(root->r);

    n = (nl > nr)? nl: nr + 1;

    return n;
}

//--------------------------------------------------------------------------------

char a[20] = {'A', 'M', 'P', 'L', 'E'};
struct tree_node_t t_tree[100];
int t_node_count;

void t_tree_init(void)
{
    int i;
//    for(i= 0; i < 20; i++)

//        a[i] = 'a' + i;


    t_node_count = 0;
}

struct tree_node_t *t_node_new(char item, struct tree_node_t *l, struct tree_node_t *r)
{
    struct tree_node_t *p = &t_tree[t_node_count];

    p->item = item;
    p->l = l;
    p->r = r;

    t_node_count++;

    return p;
}


struct tree_node_t *t_tree_create(char a[], int s, int e)
{
    int m;
    char max;

    struct tree_node_t *l,*r;

    if(s == e) return t_node_new(a[s], NULL, NULL);

    m = (s+e)/2;

    if(m > s)
    {
        printf("s - m %d - %d\n", s, m);
    }
    else
    {
        printf("m - e %d - %d\n", m + 1, e);
    }

    l = t_tree_create(a, s, m);
    r = t_tree_create(a, m + 1, e);

    max = (l->item > r->item) ? l->item: r->item;
    return t_node_new(max, l, r);
}

//--------------------------------------------------------------------------------

int main()
{
    struct tree_node_t *p;

    p = tree_init();

    printf("-----------------------------------pre-----------------------------------\n");
    tree_pre1(p);
    printf("\n");

    printf("-----------------------------------in------------------------------------\n");
    tree_in1(p);
    printf("\n");

    printf("-----------------------------------post----------------------------------\n");
    tree_post1(p);
    printf("\n");

    stack_init();

    printf("-----------------------------------pre-----------------------------------\n");
    tree_pre2(p);
    printf("\n");

    printf("-----------------------------------in------------------------------------\n");
    tree_in2(p);
    printf("\n");

    printf("-----------------------------------post----------------------------------\n");
    tree_post2(p);
    printf("\n");

    stack_free();

    queue_init();
    printf("-----------------------------------level---------------------------------\n");
    tree_level(p);
    printf("\n");

    printf("-----------------------------------count---------------------------------\n");
    printf("tree_node_count = %d\n", tree_node_count(p));

    printf("-----------------------------------heigh---------------------------------\n");
    printf("tree_node_heigh = %d\n", tree_node_heigh(p));

    tree_free(p);

    printf("-----------------------------------tournament----------------------------\n");
    t_tree_init();
    p = t_tree_create(a, 0, 4);
    tree_level(p);
}


阅读(2464) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~