在昨天发表的二叉树的基础知识后,博主趁热打铁来分享一下《数据结构之二叉树的三种遍历实现代码》,虽然准确的来说,是四种遍历方式,由于层次遍历比较简单,考试做题遇到的比较少,这里就不多说了。在分享代码之前,博主想说自己在写这代码踩到的坑,我想很多新手朋友在以后写的树的代码时大概率也会想博主一样踩这坑。踩坑不是什么坏事,暴露出来就要改正对吧。好啦,不转弯抹角啦,其实就是在树的结点分配内存时要注意申请的空间不要太小。注意指针类型和数据类型的空间大小的区别。指针类似是八个字节,数据类型要看情况,像结构体的大小是要把里面的数据类型的大小全部加起来。让我们下面一起来看看代码,在代码中体会吧(踩坑点博主会加深颜色哦)
实现代码:
#include <stdio.h>
#include <stdlib.h>
#include<string>
typedef char ElemType;
//定义结点数据结构
typedef struct BiTNode
{
ElemType data;
struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;//前一个是数据类型,后一个是指针类型
//插入根结点
void InRoot(BiTree& T, ElemType i) {
T = (BiTree)malloc(sizeof(BiTNode));//注意要申请数据类型的空间。否则会因太小而报错
T->data = i;
T->lchild = NULL;
T->rchild = NULL;
}
//插入新结点
void InNew(BiTree& p, ElemType i)
{
p = (BiTree)malloc(sizeof(BiTNode));//注意要申请数据类型的空间。否则会因太小而报错
p->data = i;
p->lchild = p->rchild = NULL;
}
//访问结点的操作
void visit(BiTree T) {
printf(" %c\n", T->data);
}
//先序遍历
void PreOrder(BiTree T) {
if (T != NULL) {
visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//中序遍历
void InOrder(BiTree T) {
if (T != NULL) {
InOrder(T->lchild);
visit(T);//访问根节点
InOrder(T->rchild);
}
}
//后序遍历
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
//构造一个树
void CreatTree(BiTree& T)
{
InRoot(T,'a');
InNew(T->lchild,'b');
InNew(T->rchild,'c');
BiTree p = T->lchild;
BiTree q = T->rchild;
InNew(p->lchild,'d');
InNew(p->rchild,'e');
InNew(q->lchild,'f');
InNew(q->rchild,'g');
InNew(q->lchild,'h');
InNew(q->rchild,'j');
}
int main() {
BiTree T;
CreatTree(T);
printf("先序遍历:\n");
PreOrder(T);
printf("中序遍历:\n");
InOrder(T);
printf("后序遍历:\n");
PostOrder(T);
}
程序执行图:
在看完之余,建议大家上机去敲一敲,多实践,毕竟想学好编程时离不开上机实践的。有兴趣的同学可以把上面的代码的数据类型换为整数或大写字母哦。好啦,今天就分享到这啦。
本贴为博主亲手整理。如有错误,请评论区指出,一起进步。谢谢大家的浏览.