二叉树3种遍历的非递归算法

http://blog.csdn.net/pipisorry/article/details/37353037

c实现:

1.先序遍历非递归算法

#define maxsize 100

typedef struct {

Bitree Elem[maxsize];

int top;

} SqStack;

void PreOrderUnrec(Bitree t) {

SqStack s;

StackInit(s);

p=t;

while (p!=null || !StackEmpty(s)) {

while (p!=null) {           //遍历左子树

visite(p->data);

push(s,p);

p=p->lchild;

}//endwhile

if (!StackEmpty(s)) {       //通过下一次循环中的内嵌while实现右子树遍历

p=pop(s);

p=p->rchild;

}//endif

}//endwhile

}//PreOrderUnrec

2.中序遍历非递归算法

#define maxsize 100

typedef struct {

Bitree Elem[maxsize];

int top;

} SqStack;

void InOrderUnrec(Bitree t) {

SqStack s;

StackInit(s);

p=t;

while (p!=null || !StackEmpty(s)) {

while (p!=null) {           //遍历左子树

push(s,p);

p=p->lchild;

}//endwhile

if (!StackEmpty(s)) {

p=pop(s);

visite(p->data);        //訪问根结点

p=p->rchild;            //通过下一次循环实现右子树遍历

}//endif

}//endwhile

}//InOrderUnrec

3.后序遍历非递归算法

#define maxsize 100

typedef enum {L,R} tagtype;

typedef struct {

Bitree ptr;

tagtype tag;

} stacknode;

typedef struct {

stacknode Elem[maxsize];

int top;

} SqStack;

void PostOrderUnrec(Bitree t) {

SqStack s;

stacknode x;

StackInit(s);

p=t;

do {

while (p!=null) {      //遍历左子树

x.ptr = p;

x.tag = L;         //标记为左子树

push(s,x);

p=p->lchild;

}

while (!StackEmpty(s) && s.Elem[s.top].tag==R) {

x = pop(s);

p = x.ptr;

visite(p->data);   //tag为R,表示右子树訪问完成,故訪问根结点

}

if (!StackEmpty(s)) {

s.Elem[s.top].tag =R;     //遍历右子树

p=s.Elem[s.top].ptr->rchild;

}

} while (!StackEmpty(s));

}//PostOrderUnrec

c++实现:

ref:二叉树遍历之非递归算法http://blog.csdn.net/sgbfblog/article/details/7773103

ref:http://siwei1987.blog.51cto.com/430256/118551

from:http://blog.csdn.net/pipisorry/article/details/37353037

版权声明:这篇文章的博客http://blog.csdn.net/pipisorry原创文章,博客,未经同意不得转载。

时间: 2024-10-15 05:09:53

二叉树3种遍历的非递归算法的相关文章

二叉树后序遍历的非递归算法(C语言)

首先非常感谢‘hicjiajia’的博文:二叉树后序遍历(非递归) 这篇随笔开启我的博客进程,成为万千程序员中的一员,坚持走到更远! 折磨了我一下午的后序遍历中午得到解决,关键在于标记右子树是否被访问过,考虑过修改二叉树结点的数据结构,增加一个visit域,或者建一个栈存储已访问的结点.都比较麻烦没有调试成功.若将右子树也入栈,如果没有访问标记的话,会改变访问的次序,甚至出现死循环,这是比较危险的情况.从借鉴的博文里,摘录并改写为C的代码,基本上没有改动.后续问题努力写出自己的原创代码. 二叉树

JAVA语言实现二叉树的层次遍历的非递归算法及递归算法

/** 二叉树节点 */ public class BTNode { private char key; private BTNode left, right; public BTNode(char key) { this(key, null, null); } public BTNode(char key, BTNode left, BTNode right) { this.key = key; this.left = left; this.right = right; } public ch

二叉树--后序遍历的非递归算法

后续遍历关键在于,当节点的  右子树存在且被访问后  或者是  右子树为空  才能访问自身. 在遍历过程中,先将节点从的左孩子到最左节点压栈, 设置标志变量 flag 来判断是否访问过左孩子, pre指针来指向先前访问过的节点. 所有左孩子压栈后, 最后一个节点的左孩子为空,已被访问p = NULL , 令flag=1 当左孩子被访问时,进入循环,取栈顶节点. 1. 当栈顶节点的右孩子 等于 空  或  前一个被访问的节点  时, 访问该节点, 令pre 等于当前节点,pre = p, 当前节点

二叉树三种遍历非递归算法

http://blog.csdn.net/pipisorry/article/details/37353037 c实现: 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; } SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { w

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

二叉树三种遍历递归及非递归实现(Java)

import java.util.Stack; //二叉树三种遍历递归及非递归实现(Java) public class Traverse { /******************定义二叉树**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode

二叉树的广义表创建及中序遍历、后序遍历、层次遍历的非递归算法(C语言)

广义表创建二叉树关于用广义表的形式表示二叉树的形式如下 ①广义表中的一个字母代表一个结点的数据信息.②每个根结点作为由子树构成的表的名字放在义表的前面.③每个结点的左子树与右子树之间用逗号分开.若结点只有右子树面无左子树,则该逗号不能省略.④在整个广义表的末尾加一个特殊符号(如“@”)作为结束标志. 下面先用自然语言描述算法如下.依次从广义表中取得-个元素,并对取得的元素做如下相应的处理. ①若当前取得的元素为字母,则按如下规则建立一个新的(链)结点.a)若该结点为二叉树的根结点,则将该结点的地

二叉树先序中序非递归算法

一直想要写的 二叉树 中序 先序 后序遍历算法 当年学习DS最虚的就是这个,因为非递归算法复杂,测试数据不好弄,只能一个一个手动插入.感觉明显比图的难,虽然大家都觉得图更难..... 递归的太简单了,就不写了.关键是非递归版本. 先序: 我自己的版本: void RootPreTraverse(Node* p) { Stack S; while(S not empty) { p=S.top(); S.pop(); Show(p); if(p->right!=null) S.push(p->ri