#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct BiTNode
{
ElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
BiTree Create()
{
ElemType ch;
BiTree T;
scanf("%c", &ch);
if (ch == '#') return NULL;
T = (BiTree)malloc(sizeof(struct BiTNode));
T->data = ch;
T->lchild = Create();
T->rchild = Create();
return T;
}
void Preorder(BiTree T)//先序
{
if (T)
{
printf("%c", T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
void Inorder(BiTree T)//中序
{
if (T)
{
Inorder(T->lchild);
//cout << T->data;
printf("%c", T->data);
Inorder(T->rchild);
}
}
void Postorder(BiTree T)//后序
{
if (T)
{
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c", T->data);
//cout << T->data;
}
}
//输出结点数
int count(BiTree T)
{
if (!T) return 0;//空树,0个结点
return count(T->lchild) + count(T->rchild) + 1;//不是空树至少有1个结点
}
int sum = 0;//全局变量求节点数
void count1(BiTree T)
{
if (T)//不是空树就继续遍历
{
sum++;
count1(T->lchild);
count1(T->rchild);
}
}
int count2(BiTree T)//同上改为局部变量
{
int count = 0;
if (T)
{
count = 1;
count += count2(T->lchild);
count += count2(T->rchild);
}
return count;
}
//求层数
int depth(BiTree T)
{
if (T)
{
int ld = depth(T->lchild);
int rd = depth(T->rchild);
return ld > rd ? ld + 1 : rd + 1;
}
return 0;
}
//某层的结点(先序)调顺序改变输出位置
void traverse(BiTree T, int level, int now)
{
if (T)
{
if (now == level) printf("%c", T->data);
traverse(T->lchild, level, now + 1);//下一层,加一
traverse(T->rchild, level, now + 1);
}
}
int main()
{
BiTree T = Create();
printf("Preorder:"); Preorder(T); printf("\n");
printf("Inorder:"); Inorder(T); printf("\n");
printf("Postorder:"); Postorder(T); printf("\n");
printf("结点=%d\n", count(T));
count1(T);
printf("%d_结点\n", sum);
printf("2结点=%d\n", count2(T));
return 0;
}
//样例
//ABC##DE#G##F###
二叉树的三种遍历(C实现)
最新推荐文章于 2022-08-22 17:31:30 发布