数据结构之二叉树的遍历
一、二叉树的遍历
遍历:顺着某一条搜索路径巡访二叉树中的结点,使的每个结点均被访问一次,而且仅被访问一次。
遍历的目的:得到树中所有结点的一个线性排序
遍历的作用:是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心
一般讨论三种遍历方案:1.根左右,2.左根右,3.左右根
知道先序序列和中序序列,或者后序序列和中序序列可以唯一确定一颗二叉树
1.算法实现(递归)
1.按照 根左右 进行遍历
Status PreOrderTraverse (BiTree T) {
if(T == NULL) return OK // 空二叉树
else {
visit(T)// 访问根结点
PreOrderTraverse (T -> lchild) // 递归遍历左子树
PreOrderTraverse (T- >rchild) // 递归遍历右子树
}
}
2.按照 左根右 进行遍历
Status InOrderTraverse (BiTree T) {
if(T == NULL) return OK // 空二叉树
else {
PreOrderTraverse (T -> lchild) // 递归遍历左子树
visit(T)// 访问根结点
PreOrderTraverse (T- >rchild) // 递归遍历右子树
}
}
3.按照 左右根 进行遍历
Status PreOrderTraverse (BiTree T) {
if(T == NULL) return OK // 空二叉树
else {
PreOrderTraverse (T -> lchild) // 递归遍历左子树
PreOrderTraverse (T- >rchild) // 递归遍历右子树
visit(T)// 访问根结点
}
}
4.总结
如果去掉访问根结点的语句,三种算法是完全相同的,或者说这三种算法的访问路径是相同的,只是访问结点的时机不同。
2.算法(非递归)
1.中序遍历的非递归算法
通过栈来实现,遇到一个元素,将其入栈,如果入栈元素的后续的子结点为空将其出栈
3.二叉树的层次遍历
思路:将根结点进队,
队不为空时循环,从队列中出一个结点*p,访问它;
若它有左孩子结点,将左孩子结点进队,若它有右孩子结点,将右孩子结点进队,否则出队。
void LevelOrder(BTNode *b) {
BTNode *p; SqQueue *qu;
InitQueue(qu); // 初始化队列
enQueue(qu,b); // 根结点指针进入队列
while(!QueueEmpty(qu)) { // 如果队列不为空,则循环
deQueue(qu,p); // 出队结点p
printf("%C",p->data) // 访问结点P
if(p->lchild != NULL) enQueue(qu, p->lchild) // 有左孩子时将其进队
if(p->lchild != NULL) enQueue(qu, p->rchild) // 有右孩子时将其进队
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)