二叉树遍历的定义 |
二叉树的遍历:按一定规律对二叉树中的每个结点进行访问且仅访问一次。其中的访问可指计算二叉树中结点的数据信息,打印该结点的信息,也包括对结点进行任何其他操作。
为什么需要遍历二叉树?
二叉树是非线性数据结构,通过遍历可以将二叉树中的结点访问一次且仅一次,从而得到访问结点的顺序序列。从这个意义上说,遍历操作就是将二叉树中结点按一定规律线性化的操作,目的在于将非线性化结构变成线性化的访问序列。
二叉树遍历的规律及相关递归遍历算法 |
先序遍历 |
(1)先序遍历(DLR)操作过程
若二叉树为空,则空操作,否则依次执行如下 3 个操作:
① 访问根结点;
② 按先序遍历左子树;
③ 按先序遍历右子树。
void PreOrder(BiTree root)
/*先序遍历二叉树, root 为指向二叉树(或某一子树)根结点的指针*/
{
if (root != NULL)
{
Visit(root->data); /*访问根结点*/
PreOrder(root->LChild); /*先序遍历左子树*/
PreOrder(root->RChild); /*先序遍历右子树*/
}
}
中序遍历 |
(2)中序遍历(LDR)操作过程
若二叉树为空,则空操作,否则依次执行如下 3 个操作:
① 按中序遍历左子树;
② 访问根结点;
③ 按中序遍历右子树。
void InOrder(BiTree root)
/*中序遍历二叉树, root 为指向二叉树(或某一子树)根结点的指针*/
{
if (root != NULL)
{
InOrder(root->LChild); /*中序遍历左子树*/
Visit(root->data); /*访问根结点*/
InOrder(root->RChild); /*中序遍历右子树*/
}
}
后序遍历 |
(3)后序遍历(LRD)操作过程
若二叉树为空,则空操作,否则依次执行如下 3 个操作:
① 按后序遍历左子树;
② 按后序遍历右子树;
③ 访问根结点。
void PostOrder(BiTree root)
/* 后序遍历二叉树,root 为指向二叉树(或某一子树)根结点的指针*/
{
if (root != NULL)
{
PostOrder(root->LChild); /*后序遍历左子树*/
PostOrder(root->RChild); /*后序遍历右子树*
Visit(root ->data); /*访问根结点*/
}
}
递归算法的时间复杂度分析:设二叉树有 n 个结点,对每个结点都要进行一次入栈和出栈的
操作,即入栈和出栈各执行 n 次,对结点的访问也是 n 次。这些二叉树递归遍历算法的时间
复杂度为 O(n)