/**
* 实验题目:
* 求二叉树中的结点个数、叶子结点个数、某结点层次和二叉树宽度
* 实验目的:
* 掌握二叉树遍历算法的应用,熟练使用先序、中序、后序三种递归
* 遍历算法和层次遍历算法进行二叉树问题求解。
* 实验内容:
* 设计程序,实现如下功能:
* 1、输出二叉树b的结点个数
* 2、输出二叉树b的叶子结点个数
* 3、求二叉树b中指定结点值的结点的层次
* 4、利用层次遍历求二叉树b的宽度
*/
#include <stdio.h>
#include <malloc.h>
#define MAX_SIZE 100
typedef char ElemType;
typedef struct node
{
ElemType data; // 数据元素
struct node *lchild; // 指向左孩子结点
struct node *rchild; // 指向右孩子结点
}BTNode; // 声明二叉链结点类型
/*-------------由括号表示串str创建二叉链b-----------------*/
static void create_btree(BTNode *&b, char *str) // 创建二叉树(形参b:指针的引用)
{
BTNode *p;
BTNode *St[MAX_SIZE]; // 定义一个顺序栈
int k;
int j = 0;
int top = -1; // 栈顶指针初始化
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的存储空间
p->data = ch;
p->lchild = p->rchild = NULL;
if(b == NULL) // 若b为空,p置为二叉树的根结点
b = p;
else // 已建立二叉树根结点
{
switch(k)
{