王道-考研-数据结构-二叉树的遍历

二叉树的遍历

按照某条搜索路径访问树中的每个结点,树的每个结点均被访问一次,而且只访问一次。

1. 先序遍历

若二叉树非空:

  1. 访问根结点。
  2. 先序遍历左子树。
  3. 先序遍历右子树。
void PreOrder(BiTree T)
{
if (T != NULL)
{
visit(T);
PreOrder(T.lchild);
PreOrder(T.rchild);
}
}

时间复杂度:\(O(n)\)

2. 中序遍历

若二叉树非空:

  1. 中序遍历左子树。
  2. 访问根结点。
  3. 中序遍历右子树。
void InOrder(BiTree T)
{
if (T != NULL)
{
InOrder(T.lchild);
visit(T);
InOrder(T.rchild);
}
}

时间复杂度:\(O(n)\)

3. 后序遍历

若二叉树非空:

  1. 后序遍历左子树。
  2. 后序遍历右子树。
  3. 访问根结点。
void PostOrder(BiTree T)
{
if (T != NULL)
{
PostOrder(T.lchild);
PostOrder(T.rchild);
visit(T);
}
}

时间复杂度:\(O(n)\)

4. 中序遍历非递归算法

借助。算法思想:

  1. 初始时依次扫描根结点的所有左侧结点并将他们一一进栈;
  2. 出栈一个结点,访问它;
  3. 扫描该结点的右孩子结点并将其进栈;
  4. 依次扫描右孩子结点的所有左侧结点,并一一进栈;
  5. 反复该过程直到栈空为止。
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. 层次遍历

借助队列。算法思想:

  1. 初始将根入队并访问根结点;
  2. 若有左子树,则将左子树的根入队;
  3. 若有右子树,则将右子树的根入队;
  4. 然后出队,访问该结点;
  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. 由遍历序列构造二叉树

  • 先序(或后序)遍历序列+中序遍历序列可以确定一棵二叉树。
  • 而先序遍历序列+后序遍历序列不可以确定一颗二叉树。
  1. 在先序序列中,第一个结点是根结点;
  2. 根结点将中序遍历序列划分为两部分;
  3. 然后在先序序列中确定两部分的结点,并且两部分的第一个结点分别为左子树的根结点和右子树的根结点;
  4. 在子树中递归重复该过程,边能唯一确定一棵二叉树。

层次遍历序列+中序遍历序列也可以确定一棵二叉树。

posted @   咸瑜  阅读(142)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示