计算二叉树中值为data的结点所在的层数



定义二叉树的二叉链表,设其元素为整数。然后编写函数,计算二叉树中值为data结点所在的层数。

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define TREESIZE 7
typedef char ElemType;
typedef struct BTNode
{
	ElemType data;
	struct BTNode *lchild, *rchild;
} BTNode, *BTree;

ElemType datas[MAXSIZE] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G' };


BTNode *GetBTNode();//返回一个二叉树节点
BTree CreateBTree();//静态创建一个二叉树

void Visit(BTNode *btnode);//输出某一节点数据
void Preorder(BTree btree); //前序遍历
void Inorder(BTree btree); //中序遍历
void Postorder(BTree btree);//后序遍历
void ShowTree(BTree btree);//静态输出二叉树图形

//在btree为根的二叉树中,查找数据data,并将res赋值为data所在的层数(根节点层数为1)
//floor记录当前访问的层数
void GetFloor(BTree btree, ElemType data, int floor, int *res);

int main()
{
	BTree btree = CreateBTree();
	int floor = 1, res;
	ElemType data;
	printf("二叉树:\n");
	ShowTree(btree); printf("\n");
	printf("前序遍历:"); Preorder(btree); printf("\n");
	printf("中序遍历:"); Inorder(btree); printf("\n");
	printf("后序遍历:"); Postorder(btree); printf("\n");
	printf("\n**** 计算二叉树中值为 data 结点所在的层数 ****\n\n");

	data = 'F';//要查找的数据
	res = -1;//查找结果初始值为-1(层数)
	GetFloor(btree, data, floor, &res);
	if (res>0)
	{
		printf("数据 %c 在第 %d 层\n", data, res);
	}
	else
	{
		printf("数据 %c 不存在!", data);
	}

	getchar();
	return 0;
}


//在btree为根的二叉树中,查找数据data,并将res赋值为data所在的层数(根节点层数为1)
//floor记录当前访问的层数
void GetFloor(BTree btree, ElemType data, int floor, int *res)
{
	if (btree != NULL)
	{
		if (btree->data == data)
		{
			*res = floor;
		}
		GetFloor(btree->lchild, data, floor + 1, res);
		GetFloor(btree->rchild, data, floor + 1, res);
	}
}

void Visit(BTNode *btnode)
{
	printf("%c ", btnode->data);
}

BTNode *GetBTNode()
{
	BTNode *btnode = (BTNode *)malloc(sizeof(BTNode));
	btnode->data = '#';
	btnode->lchild = NULL;
	btnode->rchild = NULL;
	return btnode;
}

BTree CreateBTree()
{
	int i;
	BTNode *btns[TREESIZE];
	for (i = 0; i < TREESIZE; i++)
	{
		btns[i] = GetBTNode();
		btns[i]->data = datas[i];
	}
	btns[0]->lchild = btns[1];
	btns[0]->rchild = btns[2];
	btns[1]->lchild = btns[3];
	btns[1]->rchild = btns[4];
	btns[2]->lchild = btns[5];
	btns[2]->rchild = btns[6];
	return btns[0];
}

void ShowTree(BTree btree)
{
	printf("   ");
	printf("%c", btree->data);
	printf("\n");

	printf(" "); printf("%c", btree->lchild->data);
	printf("   "); printf("%c", btree->rchild->data);
	printf("\n");

	printf("%c", btree->lchild->lchild->data);
	printf(" "); printf("%c", btree->lchild->rchild->data);
	printf(" "); printf("%c", btree->rchild->lchild->data);
	printf(" "); printf("%c", btree->rchild->rchild->data);
	printf("\n");
}

void Preorder(BTree btree)
{
	if (btree != NULL)
	{
		Visit(btree);
		Preorder(btree->lchild);
		Preorder(btree->rchild);
	}
}

void Inorder(BTree btree)
{
	if (btree != NULL)
	{
		Inorder(btree->lchild);
		Visit(btree);
		Inorder(btree->rchild);
	}
}

void Postorder(BTree btree)
{
	if (btree != NULL)
	{
		Postorder(btree->lchild);
		Postorder(btree->rchild);
		Visit(btree);
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值