数据结构(实验C语言版)
二叉树的基本操作
一、实验目的
- 掌握二叉树链表的结构和二叉树的建立过程
- 掌握用递归方法实现二叉树遍历的操作
二、实验环境
硬件环境要求:
PC机(单机)
使用的软件名称、版本号以及模块:
VS2010或Visual C++ 6.0或Win-TC等。
三、实验内容
1、编写一个程序实现二叉树的各种运算,并完成如下功能:
(1)输出二叉树b;(b为下图所示的二叉树)
(2)输出H节点的左、右孩子节点值;
(3)输出二叉树b的深度;
(4)输出二叉树b的节点个数;
(5)输出二叉树b的叶子节点个数;
(6)释放二叉树b。
四、实验要求
1、用 VS2010 工具创建文件或程序,输入代码后,进行编译运行或在控制台 执行。
2、观看程序运行结果,并根据结果进行思考,对程序进行修改和总结。
源代码
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; //数据元素
struct node *lchild; //指向左孩子
struct node *rchild; //指向右孩子
} BTNode;
void CreateBTNode(BTNode *&b, char *str);
void DispBTNode(BTNode *b);
BTNode *FindNode(BTNode *b, ElemType x);
BTNode *LchildNode(BTNode *p);
BTNode *RchildNode(BTNode *p);
int BTNodeDepth(BTNode *b);
int Nodes(BTNode *b);
int LeafNodes(BTNode *b);
void DestroyBTNode(BTNode *&b);
void CreateBTNode(BTNode *&b, char *str) //由str串创建二叉链
{
BTNode *St[MaxSize], *p = NULL;
int top = -1, k, j = 0;
char ch;
b = NULL; //建立的二叉树初始时为空
ch = str[j];
while (ch != '\0') //str未扫描完时循环
{
switch (ch)
{
case '(':top++; St[top] = p; k = 1; break; //为左节点
case ')':top--; break;
case ',':k = 2; break; //为右节点
default:p = (BTNode *)malloc(sizeof(BTNode));
p->data = ch; p->lchild = p->rchild = NULL;
if (b == NULL) //p指向二叉树的根节点
b = p;
else //已建立二叉树根节点
{
switch (k)
{
case 1:St[top]->lchild = p; break;
case 2:St[top]->rchild = p; break;
}
}
}
j++;
ch = str[j];
}
}
void DispBTNode(BTNode *b) //以括号表示法输出二叉树
{
if (b != NULL)
{
printf("%c", b->data);
if (b->lchild != NULL || b->rchild != NULL)
{
printf("(");
DispBTNode(b->lchild);
if (b->rchild != NULL) printf(",");
DispBTNode(b->rchild);
printf(")");
}
}
}
BTNode *FindNode(BTNode *b, ElemType x) //返回data域为x的节点指针
{
BTNode *p;
if (b == NULL)
return NULL;
else if (b->data == x)
return b;
else
{
p = FindNode(b->lchild, x);
if (p != NULL)
return p;
else
return FindNode(b->rchild, x);
}
}
BTNode *LchildNode(BTNode *p) //返回*p节点的左孩子节点指针
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p) //返回*p节点的右孩子节点指针
{
return p->rchild;
}
int BTNodeDepth(BTNode *b) //求二叉树b的深度
{
int lchilddep, rchilddep;
if (b == NULL)
return(0); //空树的高度为0
else
{
lchilddep = BTNodeDepth(b->lchild); //求左子树的高度为lchilddep
rchilddep = BTNodeDepth(b->rchild); //求右子树的高度为rchilddep
return (lchilddep>rchilddep) ? (lchilddep + 1) : (rchilddep + 1);
}
}
int Nodes(BTNode *b) //求二叉树b的节点个数
{
int num1, num2;
if (b == NULL)
return 0;
else if (b->lchild == NULL && b->rchild == NULL)
return 1;
else
{
num1 = Nodes(b->lchild);
num2 = Nodes(b->rchild);
return (num1 + num2 + 1);
}
}
int LeafNodes(BTNode *b) //求二叉树b的叶子节点个数
{
int num1, num2;
if (b == NULL)
return 0;
else if (b->lchild == NULL && b->rchild == NULL)
return 1;
else
{
num1 = LeafNodes(b->lchild);
num2 = LeafNodes(b->rchild);
return (num1 + num2);
}
}
void DestroyBTNode(BTNode *&b) //摧毁树
{
if (b != NULL)
{
DestroyBTNode(b->lchild);
DestroyBTNode(b->rchild);
free(b);
}
}
int main()
{
BTNode *b, *p, *lp, *rp;;
CreateBTNode(b, "A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
printf("二叉树的基本运算如下:\n");
printf(" (1)输出二叉树:"); DispBTNode(b); printf("\n");
printf(" (2)H节点:");
p = FindNode(b, 'H');
if (p != NULL)
{
lp = LchildNode(p);
if (lp != NULL)
printf("左孩子为%c ", lp->data);
else
printf("无左孩子 ");
rp = RchildNode(p);
if (rp != NULL)
printf("右孩子为%c", rp->data);
else
printf("无右孩子 ");
}
printf("\n");
printf(" (3)二叉树b的深度:%d\n", BTNodeDepth(b));
printf(" (4)二叉树b的节点个数:%d\n", Nodes(b));
printf(" (5)二叉树b的叶子节点个数:%d\n", LeafNodes(b));
printf(" (6)释放二叉树b\n");
DestroyBTNode(b);
return 0;
}