建立二叉树和输出二叉树

论坛 期权论坛 期权     
wu爱cong   2018-4-28 02:16   6882   2
建立二叉树和输出二叉树( 请用非递归的方法)
分别用以下方法建立二叉树并显示出来:
①用先序遍历的输入序列;
②用层次遍历的输入序列;
③用先序和中序遍历的输出结果;
要C语言编译的,能有注释最好了。
要能运行的,不能运行的就算了啊
分享到 :
0 人收藏

2 个回复

正序浏览
3#
匿名_热心网友  4级常客 | 2018-4-30 01:12:58
Array db dup (5)
db dup (5)
db dup (5)
db dup (5)
db dup (5)

可以象上面那样定义一个缓冲区, 放数组, 在用中断输入输出 ,21H里的0xaH中断进行输入,输出用0x9H,
大概是这样的.
2#
丹明扬  4级常客 | 2018-4-30 01:12:57
#include
#include
#define  MAXL 100
typedef int Elemtype ;

typedef struct
{
    Elemtype e;
} Elem;
typedef struct Bitree
{
    Elem data;
    struct Bitree * lchild,*rchild;
} BITnode,*Bitree;

Bitree T = NULL;   ///全局变量
void  Createtree(Bitree *T)  //创建二叉树
{
    Elemtype a;
    scanf("%d",&a);
    if (a == 0 )
    {
        *T = NULL;
    }
    else
    {
        *T = (Bitree)malloc(sizeof(BITnode));
        if(!T)
        {
            exit(1);
        }
        (*T)->data.e = a;
        Createtree(&(*T)->lchild);
        Createtree(&(*T)->rchild);
    }
    return  ;
}
//前序遍历
void PreTravel(Bitree T)
{
    if(T)
    {
        printf("  %d",T->data.e);
        PreTravel(T->lchild);
        PreTravel(T->rchild);
    }
}
//中序遍历
void MidTravel(Bitree T)
{
    if(T)
    {
        MidTravel(T->lchild);
        printf("  %d",T->data.e);
        MidTravel(T->rchild);

    }
}
//后序遍历
void PostTravel(Bitree T)
{
    if(T)
    {
        PostTravel(T->lchild);
        PostTravel(T->rchild);
        printf("  %d",T->data.e);
    }
}
//递归计算叶子数
int Count_leaf(Bitree T)
{
    if (T == NULL)
    {
        return 0;
    }
    else if (T->lchild == NULL && T->rchild == NULL)
    {
        return 1;
    }
    else
    {
        return Count_leaf(T->lchild) + Count_leaf(T->rchild);
    }
}
///非递归计算叶子结点个数
///用栈存放节点  Not_Leaf_Count计算叶子结点个数
typedef struct
{
    int top;
    Bitree MAXSIZE[MAXL];
} *Stack, Le_Node;

int Not_Count_Leaf(Bitree T)
{
    int Not_Leaf_Count = 0;
    Stack s;
    s = (Stack )malloc(sizeof(Le_Node));
    s ->top =0;
    while (T != NULL || s->top != 0)
    {
        if (T != NULL)
        {

            s->MAXSIZE[s->top] = T;
            s->top ++;
            T = T->lchild;
        }
        else
        {     s->top --;
            T = s->MAXSIZE[s->top];

            if (T->lchild == NULL && T->rchild == NULL)
            {
                Not_Leaf_Count++;
            }
            T = T->rchild;
        }
    }
    return Not_Leaf_Count;
}

//计算二叉树的高度
int Height_Bitree(Bitree T)
{
    int h1,h2;
    if (T != NULL)
    {
        h1 = Height_Bitree(T->lchild);
        h2 = Height_Bitree(T->rchild);
        if (h1 > h2)
        {
            return h1+1;
        }
        else
        {
            return h2+1;
        }
    }
    else
        return 0;
}
//非递归计算二叉树高度
int Not_Height_Bitree(Bitree T)
{
    Bitree Que[MAXL];
    int hp = 0,dp = 0,rear = 0,tp = 1,lc = 1;
    Bitree p;
    if (T != NULL) //根节点入队
    {
        Que[rear++] = T;

    }
    while (rear != 0)
    {
        p = Que[--rear];//队头元素出队
        hp ++;   //为已访问的节点数
        if (p->lchild != NULL)
        {
            Que[rear++] = p->lchild;
            tp ++;  //记录历史入队的节点数
        }
        if (p->rchild != NULL)
        {
            Que[rear++] = p->rchild;
            tp ++;
        }
        if(hp == lc)  //当hp = lc时,表明本层节点均已访问完
        {
            dp ++;
            lc = tp;
        }
    }
    return dp;
}
//按层次遍历
void Level_Travel(Bitree T)
{
    Bitree Que[MAXL];
    int front = 0,rear = 0;
    Bitree p;
    if (T != NULL) //根节点入队
    {
        Que[rear] = T;
        rear = (rear+1)%MAXL;
    }
    while (front != rear)
    {
        p = Que[front];//队头元素出队
        front = (front +1)% MAXL;
        printf("  %d",p->data.e);
        if (p->lchild != NULL)
        {
            Que[rear] = p->lchild;
            rear = (rear + 1)%MAXL;
        }
        if (p->rchild != NULL)
        {
            Que[rear] = p->rchild;
            rear = (rear+1)%MAXL;
        }
    }
    return ;
}

//非递归先序遍历
void Not_PreTravel(Bitree T)
{
    Bitree stack[MAXL];
    Bitree p;
    int top ;
    if (T != NULL)
    {
        top = 0;
        p = T;
        while (p != NULL || top > 0)
        {
            while (p != NULL)
            {
                printf("  %d",p->data.e);
                stack[top] = p;
                top ++;
                p = p->lchild;
            }
            if (top > 0)
            {
                top--;
                p = stack[top];
                p = p->rchild;
            }
        }
    }

}
//非递归中序遍历
void Not_MidTravel(Bitree T)
{
    Bitree stack[MAXL];
    Bitree p;
    int top;
    if (T != NULL)
    {
        top = 0;
        p  = T;
        while (p != NULL || top > 0)
        {
            while (p != NULL)
            {
                stack[top] = p;
                top ++;
                p = p->lchild;
            }
            if (top > 0)
            {
                top--;
                p = stack[top];
                printf("  %d",p->data.e);
                p = p->rchild;
            }
        }
    }
}
//非递归后续遍历
typedef struct
{
    Bitree ptr;
    int tag;
} stacknode;
void Not_PostTravel(Bitree T)
{
    stacknode s[MAXL];
    stacknode x;
    Bitree p = T;
    int top;
    if (T != NULL)
    {
        top = 0;
        p = T;
        do
        {
            while (p != NULL)  //遍历左子树
            {
                s[top].ptr = p;
                s[top].tag = 1; //标记为左子树
                top ++;
                p = p->lchild;

            }
            while (top > 0 && s[top-1].tag == 2)
            {
                x = s[--top];
                p = x.ptr;
                printf("  %d",p->data.e); //tag 为2 表示右子数访问完毕,故访问根节点
            }
            if (top > 0)
            {
                s[top-1].tag = 2; //遍历右子树
                p = s[top-1].ptr->rchild;
            }
        }
        while (top > 0);
    }
}
void menu()
{
    printf("----------------------------------------------\n\n");
    printf("0:退出\n");
    printf("1:创建二叉树  12:按层次遍历\n");
    printf("2:递归前序遍历  3:非递归前序遍历\n");
    printf("4:递归中序遍历  5:非递归中序遍历\n");
    printf("6:递归后续遍历  7:非递归后续遍历\n");
    printf("8:递归计算叶子数 9: 非递归计算叶子数\n");
    printf("10:递归计算高度     11:非递归计算高度\n");
    printf("-----------------------------------------------\n");
    return ;
}

int main()
{

    int icase ;
    menu();

    do
    {

        printf("输入您的选择:");
        scanf("%d",&icase);
        switch (icase)
        {
        case 0:
        {
            printf("退出\n");
            break ;
        }
        case 1:
        {
            printf("创建二叉树\n");
            printf("输入数据,以0结束\n");
            Createtree(&T);
            break;
        }

        case 2:
        {
            printf("递归前序遍历\n");
            PreTravel(T);
            break;
        }
        case 3:
        {
            printf("非递归前序遍历\n");
            Not_PreTravel(T);
            break;
        }
        case 4:
        {
            printf("递归中序遍历\n");
            MidTravel(T);
            break;
        }
        case 5:
        {
            printf("非递归中序遍历\n");
            Not_MidTravel(T);
            break;
        }
        case 6:
        {
            printf("递归后序遍历\n");
            PostTravel(T);
            break;
        }
        case 7:
        {
            printf("非递归后序遍历\n");
            Not_PostTravel(T);
            break ;
        }
        case 8:
        {
            printf("递归计算叶子数\n");
            printf("叶子树为:%d\n",Count_leaf(T));
            break ;
        }
        case 9:
        {
            printf("非递归计算叶子数\n");
            printf("叶子树为:%d\n",Not_Count_Leaf(T));
            break;
        }
        case 10:
        {
            printf("递归计算高度\n");
            printf("高度为:%d\n",Height_Bitree(T));

            break;
        }
        case 11:
        {
            printf("非递归计算高度\n");
            printf("高度为:%d\n",Not_Height_Bitree(T));
            break;
        }
        case 12:
        {
            printf("按层次遍历二叉树\n");
            Level_Travel(T);
            break;
        }
        default :
            ;

        }
    }
    while (icase);
    printf("-------------欢迎-----------\n");
    system("pause");
    return 0;
}
前段时间写的,自己看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP