二叉树的建立和遍历

要求:

(1)创建一棵二叉树(用键盘按照先序遍历序列输入一个字符串生成二叉树);

(2)输出前序、中序、后序遍历的遍历序列; 

(3)统计并输出二叉树的的结点个数;

(4)输出二叉树的叶子结点的个数; 

 

代码块:

按先序遍历输入字符,创建一颗二叉树。

注意:scanf()函数在接收输入单个字符时会把上一次输入的回车符号当做这次输入的字符,导致无法的输入字符数据。所以采用在scanf()格式串前加空格的方式,屏蔽回车字符。

void CreateBiTree(BiTree *T)
{
	char ch;
	scanf(" %c",&ch);
    if (ch =='#') *T = NULL;
    else
    {
        *T = (BiTree)malloc(sizeof(BiTNode));
        (*T)->data = ch;
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));
    }

遍历:

void InOrderTraverse(BiTree T)
{//中序遍历
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("%4c",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PreOrderTraverse(BiTree T)
 {//先序遍历
     if(T)
     {
         printf("%4c",T->data);
         PreOrderTraverse(T->lchild);
         PreOrderTraverse(T->rchild);
     }
 }
void PostOrderTraverse(BiTree T)
 {//后序遍历
     if(T)
     {
         PostOrderTraverse(T->lchild);
         PostOrderTraverse(T->rchild);
         printf("%4c",T->data);
     }
 }

统计结点个数和叶子结点的个数:

int NodeCount(BiTree T)
{//统计二叉树T中结点的个数
	if (T == NULL) return 0;
	else
		return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
	//结点个数为左右子树结点个数之和+1(根节点)
}
int LeafNodeCount(BiTree T)
{//统计二叉树中叶子结点的个数
    static int LeafNum=0;
    if(T)
    {
     if(T->lchild==NULL&&T->rchild==NULL)
        LeafNum++;
     LeafNodeCount(T->lchild);
     LeafNodeCount(T->rchild);
    }
    return LeafNum;
}

 

全部代码:

//按照先序遍历的次序键盘输入字符串,按照满二叉树的特点生成一棵二叉树
//输出前序、中序、后序遍历
//统计并输出二叉树的的结点个数;
//输出二叉树的叶子结点的个数;

#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
	TElemType data;						//结点数据域
	struct BiTNode *lchild, *rchild;        //左右孩子指针
}BiTNode,*BiTree;

void CreateBiTree(BiTree *T)
{
	char ch;
	scanf(" %c",&ch);
    if (ch =='#') *T = NULL;
    else
    {
        *T = (BiTree)malloc(sizeof(BiTNode));
        (*T)->data = ch;
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));
    }
}

void InOrderTraverse(BiTree T)
{//中序遍历
    if(T)
    {
        InOrderTraverse(T->lchild);
        printf("%4c",T->data);
        InOrderTraverse(T->rchild);
    }
}
void PreOrderTraverse(BiTree T)
 {//先序遍历
     if(T)
     {
         printf("%4c",T->data);
         PreOrderTraverse(T->lchild);
         PreOrderTraverse(T->rchild);
     }
 }
void PostOrderTraverse(BiTree T)
 {//后序遍历
     if(T)
     {
         PostOrderTraverse(T->lchild);
         PostOrderTraverse(T->rchild);
         printf("%4c",T->data);
     }
 }
int NodeCount(BiTree T)
{//统计二叉树T中结点的个数
	if (T == NULL) return 0;
	else
		return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
	//结点个数为左右子树结点个数之和+1(根节点)
}
int LeafNodeCount(BiTree T)
{//统计二叉树中叶子结点的个数
    static int LeafNum=0;
    if(T)
    {
     if(T->lchild==NULL&&T->rchild==NULL)
        LeafNum++;
     LeafNodeCount(T->lchild);
     LeafNodeCount(T->rchild);
    }
    return LeafNum;
}
int main()
{
	BiTree T=NULL;
	int n,m;
	printf("按先序遍历的顺序输入:");
	CreateBiTree(&T);
	printf("中序遍历:");
	InOrderTraverse(T);
	printf("\n");
	printf("先序遍历:");
	PreOrderTraverse(T);
	printf("\n");
	printf("后序遍历:");
	PostOrderTraverse(T);
	printf("\n");
	n = NodeCount(T);
	printf("二叉树中结点的个数为:%d", n);
	m=LeafNodeCount(T);
	printf("二叉树中叶子结点的个数为:%d", m);
	return 0;
}

 

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值