建立二叉树,层序、先序遍历!二叉树是一个重要的数据类型,通过建立一个链式存储结构,能够实现前序遍历,中序遍历,后序遍历。以及能够从输入的数据中得知二叉树的叶子节点的个数,二叉树的深度。

    技术2022-07-11  75

    题目要求:

    二叉树是一个重要的数据类型,通过建立一个链式存储结构,能够实现前序遍历,中序遍历,后序遍历。以及能够从输入的数据中得知二叉树的叶子节点的个数,二叉树的深度。

    流程图:

    设计:

    数据存储:采用二叉链表存储

    功能设计:首先,创建二叉树;其次打印二叉树:若二叉树为空,则空操作;否则依次打印右子树、打印根结点、打印左子树;最后,要实现二叉树的一些基本运算,包括先序遍历、中序遍历、后序遍历、计算结点数、叶子节点数。具体分别是先序遍历二叉树:利用二叉链表作为存储结构的先序遍历,先访问根结点,在依次访问左右子树;中序遍历二叉树:利用二叉链表作为存储结构的中序遍历,先访问左子树,再访问根结点,最后访问右子树;后序遍历二叉树:利用二叉链表作为存储结构的后序遍历,先访问左子树,再访问右子树,最后 访问根结点;计算二叉树叶子数:若二叉树为空,返回0;若只有根结点,返回1;否则,返回左子树+右子树;计算二叉树结点数:若二叉树为空,返回0;若只有根结点,返回1;否则,返回左子树+右子树+1。

    代码:

    #include<stdio.h> #include<malloc.h> #define maxsize 20 typedef struct node { char data;//数据 struct node *lchild,*rchild;//左右子树 int degree; }Bitree;//该结点的度 Bitree *Q[maxsize]; //创建二叉树 Bitree *Creatree() { char ch; int front,rear; Bitree *T,*s; T=NULL; front=1;rear=0; printf("层次输入结点信息(以0为结束):\n"); ch=getchar(); while(ch!='0') { s=NULL; if(ch!='#') { s=(Bitree*)malloc(sizeof(Bitree)); s->data=ch; s->lchild=s->rchild=NULL; s->degree=0; } rear++;Q[rear]=s; if(rear==1) T=s; else { if(s!=NULL&&Q[front]!=NULL) { if(rear%2==0) Q[front]->lchild=s; else Q[front]->rchild=s; s->degree=Q[front]->degree+1; } if(rear%2==1) front++; } ch=getchar(); } return T; } void xianxu(Bitree *T) //先序遍历二叉树 { if(T!=NULL){ printf("%c",T->data); xianxu(T->lchild); xianxu(T->rchild); } } void zhongxu(Bitree *T) //中序遍历二叉树 { if(T!=NULL){ zhongxu(T->lchild); printf("%c",T->data); zhongxu(T->rchild); } } void houxu(Bitree *T) //后序遍历二叉树 { if(T!=NULL){ houxu(T->lchild); houxu(T->rchild); printf("%c",T->data); } } int yezishu(Bitree *T) //求二叉树叶子数 { if(T==NULL)return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else return yezishu(T->lchild)+yezishu(T->rchild); } int jiedianshu(Bitree *T) //计算二叉树结点数 { if(T==NULL)return 0; else if(T->lchild==NULL&&T->rchild==NULL) return 1; else return jiedianshu(T->lchild)+jiedianshu(T->rchild)+1; } int height(Bitree *T) { if (T==NULL) return 0; int u=height(T->lchild); int v=height(T->rchild); if (u>v) return (u+1); return (v+1); } void main() { Bitree *TR; TR=Creatree(); printf ("先序遍历二叉树结果为:\n"); xianxu(TR); printf ("\n"); printf ("\n"); printf ("中序遍历二叉树结果为:\n"); zhongxu(TR); printf ("\n"); printf ("后序二叉树结果为:\n"); houxu(TR); printf( "该二叉树的叶子结点为:%d\n", yezishu(TR) ); printf( "该二叉树的结点数为:%d\n", jiedianshu(TR) ); height(TR); printf( "该二叉树的深度为:%d\n", height(TR) ); }
    Processed: 0.010, SQL: 9