王道-考研-数据结构-二叉树的遍历
二叉树的遍历
按照某条搜索路径访问树中的每个结点,树的每个结点均被访问一次,而且只访问一次。
1. 先序遍历
若二叉树非空:
- 访问根结点。
- 先序遍历左子树。
- 先序遍历右子树。
void PreOrder(BiTree T) { if (T != NULL) { visit(T); PreOrder(T.lchild); PreOrder(T.rchild); } }
时间复杂度:\(O(n)\)。
2. 中序遍历
若二叉树非空:
- 中序遍历左子树。
- 访问根结点。
- 中序遍历右子树。
void InOrder(BiTree T) { if (T != NULL) { InOrder(T.lchild); visit(T); InOrder(T.rchild); } }
时间复杂度:\(O(n)\)。
3. 后序遍历
若二叉树非空:
- 后序遍历左子树。
- 后序遍历右子树。
- 访问根结点。
void PostOrder(BiTree T) { if (T != NULL) { PostOrder(T.lchild); PostOrder(T.rchild); visit(T); } }
时间复杂度:\(O(n)\)。
4. 中序遍历非递归算法
借助栈。算法思想:
- 初始时依次扫描根结点的所有左侧结点并将他们一一进栈;
- 出栈一个结点,访问它;
- 扫描该结点的右孩子结点并将其进栈;
- 依次扫描右孩子结点的所有左侧结点,并一一进栈;
- 反复该过程直到栈空为止。
void InOrder2(BiTree T) { InitStack(S); BiTree p = T; while (p || IsEmpty(S)) { if (p) { Push(S, p); p = p.lchild; } else { Pop(S, p); visit(p); p = p.rchild; } } }
5. 层次遍历
借助队列。算法思想:
- 初始将根入队并访问根结点;
- 若有左子树,则将左子树的根入队;
- 若有右子树,则将右子树的根入队;
- 然后出队,访问该结点;
- 反复该过程直到队空为止。
void levelOrder(BiTree T) { InitQueue(Q); BiTree p; EnQueue(Q, T); while (!isEmpty(Q)) { DeQueue(Q, p); visit(p); if (p->lchild != NULL) { EnQueue(Q, p->lchild); } if (p->rchild != NULL) { EnQueue(Q, p->rchild); } } }
6. 由遍历序列构造二叉树
- 先序(或后序)遍历序列+中序遍历序列可以确定一棵二叉树。
- 而先序遍历序列+后序遍历序列不可以确定一颗二叉树。
- 在先序序列中,第一个结点是根结点;
- 根结点将中序遍历序列划分为两部分;
- 然后在先序序列中确定两部分的结点,并且两部分的第一个结点分别为左子树的根结点和右子树的根结点;
- 在子树中递归重复该过程,边能唯一确定一棵二叉树。
层次遍历序列+中序遍历序列也可以确定一棵二叉树。
本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/16720872.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本