二叉树遍历算法
二叉树遍历算法概述 二叉树遍历算法是计算机科学中的一种基础算法,用于遍历二叉树的所有结点。常见的二叉树遍历算法有先序遍历、中序遍历和后序遍历三种。下面是对这三种算法的详细介绍。 一、先序遍历算法 先序遍历算法是一种常用的二叉树遍历算法,其特点是先访问树的根结点,然后遍历左子树和右子树。非递归实现的先序遍历算法可以使用栈来保存信息,以便在遍历左子树后能够获取右子树的根指针。有两种实现方法: 1. 方法一:访问 T->data 后,将 T 入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为 T,出栈,再先序遍历 T 的右子树。 2. 方法二:访问 T->data 后,将 T->rchild 入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为 T->rchild,出栈,遍历以该指针为根的子树。 算法实现: ```c void PreOrder(BiTree T, Status (*Visit)(ElemType e)) { InitStack(S); while (T != NULL || !StackEmpty(S)) { while (T != NULL) { Visit(T->data); Push(S, T); T = T->lchild; } if (!StackEmpty(S)) { Pop(S, T); T = T->rchild; } } } ``` 二、中序遍历算法 中序遍历算法的特点是先遍历左子树,然后访问根结点,最后遍历右子树。在非递归实现中,同样可以使用栈来保存信息,以便在遍历左子树后能够获取根结点的指针。 算法实现: ```c void InOrder(BiTree T, Status (*Visit)(ElemType e)) { InitStack(S); while (T != NULL || !StackEmpty(S)) { while (T != NULL) { Push(S, T); T = T->lchild; } if (!StackEmpty(S)) { Pop(S, T); Visit(T->data); T = T->rchild; } } } ``` 三、后序遍历算法 后序遍历算法的特点是先遍历左子树和右子树,然后访问根结点。在非递归实现中,需要判断根结点的左右子树是否均遍历过,可以采用标记法,结点入栈时,配一个标志 tag 一同入栈。 算法实现: ```c void PostOrder(BiTree T, Status (*Visit)(ElemType e)) { InitStack(S); while (T != NULL || !StackEmpty(S)) { while (T != NULL) { Push(S, T, 0); T = T->lchild; } while (!StackEmpty(S) && GetTopTag(S) == 1) { Pop(S, T); Visit(T->data); } if (!StackEmpty(S)) { SetTopTag(S, 1); T = GetTopPointer(S); T = T->rchild; } else break; } } ``` 二叉树遍历算法的非递归实现可以使用栈来保存信息,以便在遍历子树后能够获取根结点的指针。不同的遍历顺序可以使用不同的栈操作来实现。
剩余10页未读,继续阅读
- xiao9in2013-03-20这是我们要完成的作业。
- 粉丝: 1
- 资源: 4
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助