9493 计算二叉树的结点个数

该博客介绍了如何构建二叉排序树并计算其中的节点个数。提供了插入节点的函数、前序、中序和后序遍历的实现,并给出了一个示例输入与对应的遍历输出,最后要求完成计算树节点数的函数。
摘要由CSDN通过智能技术生成

时间限制:1000MS 代码长度限制:10KB
提交次数:658 通过次数:513

题型: 编程题 语言: G++;GCC
Description
构建一个二叉排序树,插入若干数据后,给出树中结点的个数。
#include “stdio.h”
#include “malloc.h”
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;

typedef int ElemType;
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;//左右孩子指针
} BiTNode,*BiTree;

Status InsertBiTree(BiTree &T,int e) //插入新结点
{
if(T==NULL){
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=e;T->lchild=NULL;
T->rchild=NULL;
return 1;
}
if(T->data<e)
InsertBiTree(T->rchild,e);
else
InsertBiTree(T->lchild,e);
return 0;
}

Status PrintElement( ElemType e ) { // 输出元素e的值
printf("%d ", e );
return OK;
}// PrintElement

Status PreOrderTraverse( BiTree T, Status(*Visit)(ElemType) )//前序遍历二叉树
{
if(T==NULL) return 0;
Visit( T->data );
PreOrderTraverse(T->lchild,Visit);
PreOrderTraverse(T->rchild,Visit);
return OK;
} // PreOrderTraverse

Status InOrderTraverse( BiTree T, Status(*Visit)(ElemType) ) //中序遍历二叉树
{
if(T==NULL) return 0;
InOrderTraverse(T->lchild,Visit);
Visit(T->data);
InOrderTraverse(T->rchild,Visit);
return 1;
} // InOrderTraverse

Status PostOrderTraverse( BiTree T, Status(*Visit)(ElemType) )//后序遍历二叉树
{
if(T==NULL) return 0;
PostOrderTraverse(T->lchild,Visit);
PostOrderTraverse(T->rchild,Visit);
Visit(T->data);
return 1;

} // PostOrderTraverse

int TreeCount( BiTree T)//树的结点数
{
//补充内容
}

int main() //主函数
{
BiTree T=NULL;
int i,n,e;
//生成二叉排序树T

//前、中、后序遍历二叉树
PreOrderTraverse(T,PrintElement);
printf("\n");
InOrderTraverse(T,PrintElement);
printf("\n");
PostOrderTraverse(T,PrintElement);
printf("\n");

     //计数并输出

	

return 0;//补充代码

}//main

输入格式
第一行 输入一组若干个整数用空格分隔,最后输入-1表示结束(-1不作为二叉排序树中的结点)

输出格式
第一~三行 前、中、后序遍历
第四行 树的结点个数

输入样例
50 20 10 80 70 -1

输出样例
50 20 10 80 70
10 20 50 70 80
10 20 70 80 50
5

作者 30003021

#include<iostream>
using namespace std;
typedef struct node 
{
	int key;
	struct node *lchild,*rchild;
}Tree,*PTree;
void Insert(PTree &T,int e)//插入新节点 
{
	if(!T)
	{
		T=new Tree;
		T->key=e;
		T->lchild=NULL;
		T->rchild=NULL;
	}
	else if(e>T->key)
	Insert(T->rchild,e);
	else
	Insert(T->lchild,e);
}
void PreOrder(PTree &T)//先序遍历 
{
	if(T)
	{
		cout<<T->key<<' ';
		PreOrder(T->lchild);
		PreOrder(T->rchild);
	}

}
void InOrder(PTree &T)//中序遍历 
{
	if(T)
	{
		InOrder(T->lchild);
		cout<<T->key<<' ';
		InOrder(T->rchild);
	}
}
void LastOrder(PTree &T)//后序遍历 
{
	if(T)
	{
		LastOrder(T->lchild);
		LastOrder(T->rchild);
		cout<<T->key<<' ';
	}
}
void traval(PTree &T)//三种次序遍历 
{
	PreOrder(T);//先序遍历 
	cout<<endl;
	InOrder(T);//中序遍历 
	cout<<endl;
	LastOrder(T);//后序遍历 
	cout<<endl;
 }
int main()
{
	int n,count=0;
	PTree T=NULL;
	while(cin>>n&&n!=-1)
	{
		Insert(T,n);
		count++;
	}
	traval(T);//三种次序遍历树
	cout<<count;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值