二叉树的三种遍历
设计思路:
递归实现二叉树的遍历,先定义一方法,该方法以一定的顺序访问当前方法及其子树,若左子节点为空则终止对左子节点的访问,否则递归访问左子节点;若右子节点为空则终止对右子节点的访问,则递归访问右子节点;若都为空则访问当前结点即可。对于前序遍历,我们只需要在递归方法中以“当前结点–>左子树–>右子树”的顺序进行访问即可;对于中序遍历,遍历顺序则为“左子树–>当前结点–>右子树”;对于后序遍历则为“左子树–>右子树–>当前结点”。
运行结果截图:
源代码:
#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()
{
printf("请输入字符串:\n");
BiTree T = Create();
printf("前序遍历:"); Preorder(T); printf("\n");
printf("中序遍历:"); Inorder(T); printf("\n");
printf("后序遍历:"); Postorder(T); printf("\n");
printf("结点=%d\n", count(T));
count1(T);
printf("%d_结点\n", sum);
printf("2结点=%d\n", count2(T));
return 0;
}