Day 21.22 树--二叉链表使用

#include <stdio.h>

#include <stdlib.h>

#define MAX 20

 

typedef char ElementType;

typedef struct treenode

{

    ElementType value;

    struct treenode* left;

    struct treenode* right;

}*TreeNode;

 

void init(TreeNode* t);//

void create1(TreeNode* t);//

void create2(TreeNode *t);//使

void previsit(TreeNode t);//访访左子访

void midvisit(TreeNode t);//中序

void tailvisit(TreeNode t);//后序

void levelvisit(TreeNode t);//

int depth(TreeNode t);//

void update(TreeNode t,ElementType old_value,ElementType new_value);//old_valuenew_value

void print(TreeNode t);//以广

void display(TreeNode t,int format);//法进行输

void clear(TreeNode* t);//

 

char *string = "A(B(D,E(G,H)),C(F( ,I), ))";//广

char *str = "ABD##EA##H##CA#I###";//

 

int main()

{

    TreeNode tree;

    init(&tree);

    create1(&tree);

    //create2(&tree);

    previsit(tree);

    printf("\n");

    midvisit(tree);

    printf("\n");

    tailvisit(tree);

    printf("\n");

 

    levelvisit(tree);

    printf("\n");

 

    printf("the depth of tree is : %d\n",depth(tree));

 

    //update(tree,'A','Z');

    //previsit(tree);

    //printf("\n");

    print(tree);

    printf("\n");

 

    display(tree,0);

 

    clear(&tree);

    display(tree,0);

 

 

    return 0;

}

 

void init(TreeNode* t)//

{

    *t = NULL;

}

//char *string = "A(B(D,E(G,H)),C(F( ,I), ))";

void create1(TreeNode* t)//建树

{

    int i = 0;

    int flag = 1;//志,1树,2右子

    TreeNode s[MAX];//数组模拟栈

    int top = -1;//

    TreeNode p;

    while(*(string + i) != '\0')

    {

        switch(*(string + i))

        {

            case ' ':

                break;

            case '(':

                if(top == MAX-1)

                {

                    printf("the stcak is full\n");

                    exit(2);

                }

                top++;

                s[top] = p;

                flag = 1;

                break;

            case ',':

                flag = 2;

                break;

            case ')':

                if(-1 == top)

                {

                    printf("the stack is empty\n");

                    exit(3);

                }

                top--;

                break;

            default:

                p = (TreeNode)malloc(sizeof(struct treenode));

                if(NULL == p)

                {

                    exit(1);

                }

                p->value = *(string + i);

                p->left = NULL;

                p->right = NULL;

                if(NULL == *t)

                {

                    *t = p;

                }

                else

                {

                    if(flag == 1)

                    {

                        s[top]->left = p;

                    }

                    else

                    {

                        s[top]->right = p;

                    }

                }

                break;

        }

        i++;

    }

}

//char *str = "ABD##EG##H##CF#I###";

void create2(TreeNode* t)//使

{

    static int i = 0;

    char ch = *(str+i++);

    if(ch == '#')

    {

        *t = NULL;

    }

    else

    {

        *t = (TreeNode)malloc(sizeof(struct treenode));

        if(NULL == *t)

        {

            exit(1);

        }

        (*t)->value = ch;

        create2(&((*t)->left));

        create2(&((*t)->right));

    }

}

 

void previsit(TreeNode t)//访访访

{

    if(t != NULL)

    {

        printf("%c ",t->value);

        previsit(t->left);

        previsit(t->right);

    }

}

 

void midvisit(TreeNode t)//

{

    if(t != NULL)

    {

        midvisit(t->left);

        printf("%c ",t->value);

        midvisit(t->right);

    }

}

 

void tailvisit(TreeNode t)//

{

    if(t != NULL)

    {

        tailvisit(t->left);

        tailvisit(t->right);

        printf("%c ",t->value);

    }

}

 

void levelvisit(TreeNode t)//

{

    TreeNode array[MAX] = {0};//拟队

    int front = 0;

    int rear = 0;

    if(t != NULL)

    {

        array[rear] = t;

        rear = (rear+1) % MAX;

    }

 

    while(front != rear)

    {

        printf("%c ",array[front]->value);

        if(NULL != array[front]->left)

        {

            array[rear] = array[front]->left;

            rear = (rear+1) % MAX;

        }

        if(NULL != array[front]->right)

        {

            array[rear] = array[front]->right;

            rear = (rear+1) % MAX;

        }

        front = (front+1) % MAX;

    }

}

 

int depth(TreeNode t)//

{

    if(t != NULL)

    {

        int leftdepth = depth(t->left);

        int rightdepth = depth(t->right);

        return (leftdepth>rightdepth?leftdepth:rightdepth)+1;

    }

    else

    {

        return 0;

    }

}

//old_valuenew_value

void update(TreeNode t,ElementType old_value,ElementType new_value)

{

    if(NULL != t)

    {

        if(t->value == old_value)

        {

            t->value = new_value;

        }

        update(t->left,old_value,new_value);

        update(t->right,old_value,new_value);

    }

}

 

void print(TreeNode t)//广

{

    if(NULL != t)

    {

        printf("%c",t->value);

        if(NULL != t->left || NULL != t->right)

        {

            printf("(");

            if(NULL == t->left)

            {

                printf(" ");

            }

            else

            {

                print(t->left);

            }

            printf(",");

            if(NULL == t->right)

            {

                printf(" ");

            }

            else

            {

                print(t->right);

            }

            printf(")");:êo

        }

    }

}

 

void display(TreeNode t,int format)//°?示法format

{

    int i;

    if(NULL != t)

    {

        for(i = 0;i < format;i++)

        {

            printf(" ");

        }

        printf("%c\n",t->value);

        display(t->left,format+1);

        display(t->right,format+1);

    }

}

 

void clear(TreeNode* t)//

{

    if(NULL != *t)//

    {

        clear(&((*t)->left));

        clear(&((*t)->right));

        free(*t);

        *t = NULL;

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值