实验题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"); }
相关文章推荐
- 假设nn的稀疏矩阵A采用三元组表示,设计一个程序exp6-4.cpp实现如下功能:
- 编写一个程序实现循环双链表的各种基本运算(假设顺序表的元数基本类型为Char)
- 编写一个程序实现单链表的各种基本运算(假设顺序表的元数基本类型为Char)
- 编写一个程序实现顺序表的各种基本运算(假设顺序表的元数基本类型为Char)
- 编写一个程序,实现二叉树的各种运算
- 编写一个程序,实现链队的各种基本运算
- 编写一个程序,实现单链表的各种基本运算
- 编写一个程序,实现链栈的各种基本运算
- 编写一个程序,实现顺序表的各种基本运算
- 编写一个程序实现链式栈的各种基本运算(假设顺序表的元数基本类型为Char)
- 编写一个程序,实现顺序栈的各种基本运算。
- 编写一个程序,实现顺序环形队列的各种基本运算。
- 编写一个程序实现顺序栈的各种基本运算(假设顺序表的元数基本类型为Char)
- 设计一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作
- 35. 编写完成fun函数实现如下功能:从键盘输入任意一个正整数,求出它的非偶数因子,
- 使用read和write函数,编写一个程序,实现cp函数的基本功能
- 编写一个程序实现顺序串的各项基本运算
- 利用5个标签,4个文本框,2个按钮,自己设计布局实现输入三边求三角形面积。界面如下所示。三角形类的编写可以使用实验4中已经写过的三角形类,当点击“判断三边”时,若能构成三角形,在标签5上显示“可以构成三角形!”,如不能构成三角形,在标签5上显示“不能构成三
- 第十五周实验--任务2--设计分数类,开发一个窗口式程序,可以完成分数的四则运算。
- 编写一个程序实现链串的各项基本运算