您的位置:首页 > 理论基础 > 数据结构算法

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

2017-05-25 15:54 253 查看

定义二叉树的二叉链表,设其元素为整数。然后编写函数,计算二叉树中值为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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息