关于树的相关操作

两年前学习数据结构,就为了个期末考试,然而现在跨专业到计算机了,是该好好准备这方面的功课了。现在用的编译器是VS2010语言是C语言。

1、所需头文件

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

2、树的节点的定义

typedef struct BiTNode
{
	char data;
	BiTNode* lchild;
	BiTNode* rchild;
}BiTNode,*BiTree;

3、构造二叉树

//前序遍历构造一棵二叉树
int BuildTree(BiTree& T)//这里用引用是因为节点有所改变,也可以用二级指针
{
	char data;
	data=getchar();
	if(data=='#')
		T=NULL;
	else
	{
		if(!(T=(BiTree)malloc(sizeof(BiTNode)))) exit(-1);//
		T->data =data;
		BuildTree(T->lchild );
		BuildTree(T->rchild );
	}	
	return 0;
}

4、广义表输出二叉树

//广义表形式输出二叉树
void PrintBinaryTree(BiTNode* T)
{
	if(T)
	{
		printf("%c",T->data );
		if((T->lchild !=NULL)||(T->rchild !=NULL))
		{
			printf("(");
			PrintBinaryTree( T->lchild );
			printf(",");
			PrintBinaryTree( T->rchild );
			printf(")");
		}
	}
}

5、遍历二叉树

//先序遍历二叉树
int preorder(BiTree T)
{
	if(T)
	{
		printf("%c",T->data );
		preorder(T->lchild );
		preorder(T->rchild );
	}
	return 0;
}

6、求二叉树节点数

//求二叉树节点数
int precountNode(BiTree T)
{
	static int n=0;
	if(T)
	{
		n++;
		precountNode( T->lchild );
		precountNode( T->rchild );
	}
	return n;
}

7、求二叉树叶节点数

//求叶节点数
int leaf_num(BiTree T)
{
	if(T==NULL)return 0;
	if(T->lchild ==NULL&&T->rchild ==NULL) return 1;
	return (leaf_num(T->lchild )+leaf_num(T->rchild ));
}

8、求树的高度

//求树的高度
int BTDepth(BiTree T)
{
	int ldep,rdep;
	if(T==NULL) return 0;
	ldep=BTDepth(T->lchild );
	rdep=BTDepth(T->rchild );
	if(ldep>rdep)return ldep+1;
	else return rdep+1;
}

9、主函数

int _tmain(int argc, _TCHAR* argv[])
{
	BiTNode* T;
	BuildTree(T);

	printf("\n");
	printf("广义表输出二叉树为:");
	PrintBinaryTree(T);

	printf("\n");
	printf("先序遍历二叉树为:");
	preorder( T);

	printf("\n");
	printf("该二叉树节点数为:%d",precountNode(T));

	printf("\n");
	printf("该二叉的叶树节点数为:%d",leaf_num(T));

	printf("\n");
	printf("该二叉树的高度为:%d",BTDepth(T));

	system("pause");
	return 0;
}

测试在这里插入图片描述
测试数据如上图所示。
本篇文章供自己复习所用,还有许多需要补充的地方,后面再进行补充

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习使人进步好不好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值