数据结构实验课_实验五 二叉树

一、实验内容
1.数据域为字符的一棵二叉树用前序遍历方式输入,创建一个采用二叉链
表存储的二叉树,并按广义表的形式输出这棵二叉树。
2.在实验1的基础上完成这棵二叉树的中序遍历的递归算法。
3.求二叉树的高度。
4.求二叉树的叶子个数。

代码实现:

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define Stack_Size 1000
typedef char TElemType;
typedef struct BTNode
{
    
    
    TElemType data;
    struct BTNode *lchild,*rchild;
}BTNode,*BTree;

int CreateBTree(BTree *T)//前序遍历创建二叉树 
{
    
    
    char ch;scanf("%c",&ch);
    if (ch==' ')*T=NULL;
    else{
    
    
        if (!(*T=(BTNode*)malloc(sizeof(BTNode))))
            return 0;
        (*T)->data =ch;
        CreateBTree(&((*T)->lchild));
        CreateBTree(&((*T)->rchild));
    }
    return 1;
}
void DispBTNode(BTNode *b)  //广义表输出二叉树
{
    
    
    if(b!=NULL)
    {
    
    
        printf("%c",b->data);
        if(b->lchild!=NULL||b->rchild!=NULL)
        {
    
    
            printf("(");
            DispBTNode(b->lchild);
            if(b->rchild!=NULL) printf(",");
            DispBTNode(b->rchild);
            printf(")");
        }
    }
}

int BTNodeDepth(BTNode *b)   //求二叉树b的深度
{
    
    
    int lchilddep,rchilddep;

    if(b==NULL)
        return(0);
    else
    {
    
    
        lchilddep=BTNodeDepth(b->lchild); //左子数的高度
        rchilddep=BTNodeDepth(b->rchild); //右子树的高度
        return(lchilddep>rchilddep)?(lchilddep+1):(rchilddep+1);
    }
}
int LeafNodes(BTNode *p){
    
    //求二叉树叶子结点个数 
	int num1,num2;
	if(p==NULL)
		return 0;
	else if(p->lchild==NULL&&p->rchild==NULL)
		return 1;
	else{
    
    
		num1=LeafNodes(p->lchild);
		num2=LeafNodes(p->rchild);
		return (num1+num2);
	}
}
int TreeNodes(BTNode *p){
    
    //求二叉树结点个数 
	if(p==NULL)
		return 0;
	return TreeNodes(p->lchild)+TreeNodes(p->rchild)+1;
}

void InOrder(BTree  T)
{
    
    
    if (T)
    {
    
    
        InOrder(T->lchild); /*中遍历左子树*/
        printf("%6c",T->data);/*访问根结束*/
        InOrder(T->rchild);   /*中根遍历右子树*/
    }
}/*InOrder */

void LevelOrder(BTree T){
    
    //层次遍历 
    BTree q[20],p;
    int front=0, rear=0;
    if(T){
    
    
        q[rear]=T;
        rear++;
    }/*根结点不空,进队*/
    while (front!=rear)
    {
    
    
        p=q[front];front ++; printf("%6c",p->data); /*出队并访问*/
        /*若左孩子不空,进队*/
        if( p->lchild){
    
    q[rear]=p->lchild; rear++;}
        /*若右孩子不空,进队*/
        if( p->rchild){
    
    q[rear]=p->rchild; rear++;}
    }
}/* LevelOrder */

int main(){
    
    
	BTNode *b;
	CreateBTree(&b);
    printf("输出二叉树:");
    DispBTNode(b);
	printf("\n");
	InOrder(b);
	printf("\n");
	printf("Tree High=[%d]\n",BTNodeDepth(b));
	printf("Tree Leaf=[%d]\n",LeafNodes(b));
	LevelOrder(b);
	printf("\n");
	printf("Tree Nodes=[%d]\n",TreeNodes(b));
	return 0;
} 

程序演示:
在这里插入图片描述
分析

猜你喜欢

转载自blog.csdn.net/zavay/article/details/112351042