您的位置:首页 > 编程语言 > C语言/C++

实验题7.1: 编写一个程序algo7-1.cpp,实现二叉树的各种基本运算,并在此基础上设计一个程序Main.cpp完成如下功能(b为如下图所示的一棵二叉树)

2016-11-11 10:17 1071 查看
#include
#include
#define MaxSize 50
typedef char Elemtype;
typedef struct node
{
Elemtype data;
struct node * lchild;
struct node * rchild;
}BTNode;
void CreateBTNode(BTNode *& b, char * str)
{
BTNode * St[MaxSize], *p;
int top = -1, k, j = 0;
char ch;
b = NULL;
ch = str[j];
while (ch != '\0')
{
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)
b = p;
else
{
switch (k)
{
case 1:St[top]->lchild = p; break;
case 2:St[top]->rchild = p; break;
}
}
}
j++;
ch = str[j];
}

}
BTNode *FindNode(BTNode *b, Elemtype 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)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
int BTNodeHeight(BTNode *b)
{
int lchildh, rchildh;
if (b == NULL)
return 0;
else
{
lchildh = BTNodeHeight(b->lchild);
rchildh = BTNodeHeight(b->rchild);
return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
}
}
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(")");
}
}
}
int Leave(BTNode *b)
{
if (b == NULL)
return 0;
else
{
if (b->lchild == NULL && b->rchild == NULL)
return 1;
else
return(Leave(b->lchild) + Leave(b->rchild));
}
}
int Amout(BTNode *b)
{
int L = 0;
int R = 0;
if (b == NULL)
return 0;
else
{
L = Amout(b->lchild);
R = Amout(b->rchild);
return (L + R + 1);
}
}
int BTNodeWidth(BTNode *b)        //求二叉树b的宽度
{
struct
{
int floors;                 //节点的层次编号
BTNode *p;					//节点指针
}Qu[MaxSize];					//定义顺序非循环队列
int front, rear;					//定义队首和队尾
int num, max, i, n;
front = rear = 0;					//初始化队列,是队列为空
if (b != NULL)
{
rear++;
Qu[rear].p = b;					//根节点指针入队
Qu[rear].floors = 1;			//根节点的层次编号为1
while (rear != front)
{
front++;
b = Qu[front].p;            //队头出队
num = Qu[front].floors;
if (b->lchild != NULL)      //若左子树不为空,则入队
{
rear++;
Qu[rear].p = b->lchild;
Qu[rear].floors = num + 1;
}
if (b->rchild != NULL)      //若右子树不为空,则入队
{
rear++;
Qu[rear].p = b->rchild;
Qu[rear].floors = num + 1;
}
}
max = 0; num = 1; i = 1;
while (i <= rear)
{
n = 0;
while (i <= rear && Qu[i].floors == num)
{
n++; i++;
}
num = Qu[i].floors;
if (n > max) max = n;
}
return max;
}
else
return 0;
}
void main()
{
BTNode *b, *p, *lp, *rp;
printf("实验题7.1: 编写一个程序algo7-1.cpp,实现二叉树的各种基本运算,并在此基础上设计一个程序Main.cpp完成如下功能(b为如下图所示的一棵二叉树)\n(1)输出二叉树b;\n(2)输出H节点的左、右孩子节点值;\n(3)输出二叉树b的深度;\n(4)输出二叉树b的宽度;\n(5)输出二叉树b的节点个数;\n(6)输出二叉树b的叶子节点个数。\n                b\n              ↙\n             A\n          ╱   ╲\n         B       C\n       ╱ ╲   ╱ ╲\n      D     E F     G\n          ╱         ╲\n         H             I\n       ╱ ╲\n      J     K\n             ╲\n               N\n");
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", BTNodeHeight(b));
printf("(4)输出二叉树b的宽度为:%3d\n", BTNodeWidth(b));
printf("(5)二叉树b的节点个数:%d\n", Amout(b));
printf("(6)二叉树b的叶子节点个数:%d\n", Leave(b));

system("pause");
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐