树的三种遍历方法代码实现 (数据结构)C语言
2017-10-11 12:32
751 查看
树的三种遍历方法:前序,中序和后序及其代码实现。
在此分别总结先序,中序,后序的结点输出顺序。
先序: 1.访问根结点
2.访问左子树
3.访问右子树
中序:1.访问左子树
2.访问根结点
3.访问右子树
访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树。】直到访问到叶子结点后输出。
输出根。
访问右子树。【先访问右子树中的左子树,再访问右子树中的右子树。】直到访问到叶子结点后输出。
后序:1.访问左子树
2.访问右子树
3.访问根
访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树】。直到访问到叶子结点后输出。
访问右子树。【先访问右子树中的左子树,再访问右子树中的右子树】。直到访问到叶子结点后输出。
再返回访问根,并输出。
如何用栈实现递三种遍历树的算法
1)前序遍历
void preorder_nonrecursive(Bitree T) /* 先序遍历二叉树的非递归算法 */
{
initstack(S);
push(S,T); /* 根指针进栈 */
while(!stackempty(S)) {
while(gettop(S,p)&&p) { /* 向左走到尽头 */
visit(p); /* 每向前走一步都访问当前结点 */
push(S,p->lchild);
}
pop(S,p);
if(!stackempty(S)) { /* 向右走一步 */
pop(S,p);
push(S,p->rchild);
}
}
}
2)中序遍历
void inorder_nonrecursive(Bitree T)
{
initstack(S); /* 初始化栈 */
push(S, T); /* 根指针入栈 */
while (!stackempty(S)) {
while (gettop(S, p) && p) /* 向左走到尽头 */
push(S, p->lchild);
pop(S, p); /* 空指针退栈 */
if (!stackempty(S)) {
pop(S, p);
visit(p); /* 访问当前结点 */
push(S, p->rchild); /* 向右走一步 */
}
}
}
3)后序遍历
typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
} PMType; /* 有mark域的结点指针类型 */
void postorder_nonrecursive(BiTree T) /*
后续遍历二叉树的非递归算法 */
{
EMType a;
initstack(S); /* S的元素为EMType类型 */
push (S,{T,0}); /* 根结点入栈 */
while(!stackempty(S)) {
pop(S,a);
switch(a.mark)
{
case 0:
push(S,{a.ptr,1}); /* 修改mark域 */
if(a.ptr->lchild)
push(S,{a.ptr->lchild,0}); /* 访问左子树 */
break;
case 1:
push(S,{a.ptr,2}); /* 修改mark域 */
if(a.ptr->rchild)
push(S,{a.ptr->rchild,0}); /* 访问右子树 */
break;
case 2:
visit(a.ptr); /* 访问结点 */
}
}
}
在此分别总结先序,中序,后序的结点输出顺序。
先序: 1.访问根结点
2.访问左子树
3.访问右子树
中序:1.访问左子树
2.访问根结点
3.访问右子树
访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树。】直到访问到叶子结点后输出。
输出根。
访问右子树。【先访问右子树中的左子树,再访问右子树中的右子树。】直到访问到叶子结点后输出。
后序:1.访问左子树
2.访问右子树
3.访问根
访问左子树。【先访问左子树中的左子树,再访问左子树中的右子树】。直到访问到叶子结点后输出。
访问右子树。【先访问右子树中的左子树,再访问右子树中的右子树】。直到访问到叶子结点后输出。
再返回访问根,并输出。
如何用栈实现递三种遍历树的算法
1)前序遍历
void preorder_nonrecursive(Bitree T) /* 先序遍历二叉树的非递归算法 */
{
initstack(S);
push(S,T); /* 根指针进栈 */
while(!stackempty(S)) {
while(gettop(S,p)&&p) { /* 向左走到尽头 */
visit(p); /* 每向前走一步都访问当前结点 */
push(S,p->lchild);
}
pop(S,p);
if(!stackempty(S)) { /* 向右走一步 */
pop(S,p);
push(S,p->rchild);
}
}
}
2)中序遍历
void inorder_nonrecursive(Bitree T)
{
initstack(S); /* 初始化栈 */
push(S, T); /* 根指针入栈 */
while (!stackempty(S)) {
while (gettop(S, p) && p) /* 向左走到尽头 */
push(S, p->lchild);
pop(S, p); /* 空指针退栈 */
if (!stackempty(S)) {
pop(S, p);
visit(p); /* 访问当前结点 */
push(S, p->rchild); /* 向右走一步 */
}
}
}
3)后序遍历
typedef struct {
BTNode* ptr;
enum {0,1,2} mark;
} PMType; /* 有mark域的结点指针类型 */
void postorder_nonrecursive(BiTree T) /*
后续遍历二叉树的非递归算法 */
{
EMType a;
initstack(S); /* S的元素为EMType类型 */
push (S,{T,0}); /* 根结点入栈 */
while(!stackempty(S)) {
pop(S,a);
switch(a.mark)
{
case 0:
push(S,{a.ptr,1}); /* 修改mark域 */
if(a.ptr->lchild)
push(S,{a.ptr->lchild,0}); /* 访问左子树 */
break;
case 1:
push(S,{a.ptr,2}); /* 修改mark域 */
if(a.ptr->rchild)
push(S,{a.ptr->rchild,0}); /* 访问右子树 */
break;
case 2:
visit(a.ptr); /* 访问结点 */
}
}
}
相关文章推荐
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- 重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现
- c语言数据结构中二叉树的先序、中序、后序三种递归遍历代码
- C语言中—— 三种方法实现两个数值交换
- 数据结构 --静态队列的一个简单的C语言代码实现
- 三种实现方法实现数据表中遍历寻找子节点
- 三种实现方法实现数据表中遍历寻找子节点
- 黑马程序员_C语言三种方法实现两个变量值的交换
- 数据结构--二叉树代码实现(建立,前序,中序,后续遍历,树的深度,销毁)
- 【数据结构】C语言实现栈的进栈,出栈,遍历,清空等操作
- C语言实现大小写转换的三种方法
- 43 递归和非递归俩种方法实现二叉树的三种遍历
- C语言三种方法实现两个变量值的交换
- 数据结构中栈与队列的c语言代码实现
- CSS实现圆角的三种方法以下直接给出代码:
- 01背包的三种实现,典型C语言代码(附Java代码),递归实现(不推荐)
- 数据结构C语言实现之链式队列的6种算法代码
- C语言实现打印1000以内素数的三种基本方法