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

数据结构 二叉树各种基本运算的实现

2018-12-27 23:42 399 查看

数据结构 二叉树各种基本运算的实现

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100;
int Width[10] = { 0 };
int yezi = 0;
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;

void CreateBTNode(BTNode *&b, char *str)  //创建二叉树
{
BTNode *St[100], *p;
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)  //若尚未建立根节点
b = p;      //*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, char x)   //查找节点
{
BTNode *p;
if (b == NULL)           //若此时的节点为空返回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);
}
}
int BTNodeHeight(BTNode * b)  //求二叉树的高度(即深度)
{
int lchildd, rchildd;
if (b == NULL)            //空树的高度为0
return(0);
else
{
lchildd = BTNodeHeight(b->lchild);   //求左子树的高度为lchildh
rchildd = BTNodeHeight(b->rchild);   //求右子树的高度为rchildh
return(lchildd > rchildd) ? (lchildd + 1) : (rchildd + 1);   //三目运算符返回更深的子树深度
}
}
int WidthofBTNode(BTNode * b, int floor)  //求每一层二叉树的宽度
{
if (b != NULL)
{
Width[floor]++;       //若该节点不为空,该层节点数+1
WidthofBTNode(b->lchild, floor + 1);  //递归处理左子树
WidthofBTNode(b->rchild, floor + 1);  //递归处理右子树
}
else
return 0;
}
int Elemnumber(BTNode * b)   //求二叉树的节点个数
{
int lchildd, rchildd;
if (b == NULL)      //若该节点为空,返回0
return 0;
else
{
lchildd = Elemnumber(b->lchild);   //递归处理左子树
rchildd = Elemnumber(b->rchild);   //递归处理右子树
return(lchildd + rchildd + 1);     //返回所有的左、右孩子节点个数加根节点个数(即所有节点个数)
}
}
int Yezinumber(BTNode * b)   //求叶子节点个数
{
if (b != NULL)
{
if ((b->lchild&&b->rchild) != NULL)   //若左右孩子节点都不为空递归处理左右子树叶子节点个数之和
return (Yezinumber(b->lchild) + Yezinumber(b->rchild));
else                                   //其他情况
return (Yezinumber((b->lchild > b->rchild) ? (b->lchild) : (b->rchild)));
}
else
return 1;
}

int main()
{
int n;
int max = 0;
BTNode *tree;   //设置头节点
char s[100] = "A(B(D,E(,H(J,K(L,M(,N))))),C(F,G(,I)))";   //二叉树的值
BTNode *Elem;  //用于从子函数中传递指针
char *p;
p = s;         //设置子函数传递字符指针
CreateBTNode(tree, p);
printf("\n二叉树为:\n");
DispBTNode(tree);
printf(" \n");
Elem = FindNode(tree, 'H');
printf(" \n\n");
printf("H参数的左右节点的值分别为:%3c%3c\n\n", Elem->lchild->data, Elem->rchild->data);
n = BTNodeHeight(tree);
printf("二叉树的深度为:%3d\n\n", n);
WidthofBTNode(tree, 1);
for (n = 1; n <= BTNodeHeight(tree); n++)   //循环比较宽度最大的二叉树层即为二叉树的宽度
if (max<Width
)
max = Width
;
printf("二叉树的宽度为:%3d\n\n", max);
n = Elemnumber(tree);
printf("二叉树的所有节点数:%3d\n\n", n);
n = Yezinumber(tree);
printf("所有叶子节点个数:%3d\n\n", n);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: