c语言数据结构--二叉树的遍历(递归与非递归)
2019-01-20 16:18
141 查看
二叉树的递归遍历(若空遍历结束)
先序遍历
1>访问根节点
2>先序递归左子树
3>先序递归右子树
算法
void PreOrder (BiTree bt) { if(bt==NULL) return; printf("%d",bt->data);//访问当前根节点数据 PreOrder(bt->lchild); PreOrder(bt->rchild); }
中序遍历将访问根节点数据放置遍历左子树之后;
后序遍历将访问根节点数据放置遍历右子树之后;
非递归遍历
无论是先序,中序还是后序,都是从根节点开始沿左子树深入下去,深入到最左端,无法深入下去时,返回。再沿刚才访问的左子树的结点访问其右子树,同样,当访问不下去,返回上一结点,继续以同样的方法遍历右子树。直到从最后根节点的右子树返回到根节点。
在这一过程中后深入的节点先返回,所以用栈来存储节点。
先序非递归遍历算法
void NRPreOrder(BiTree bt) { BiTNode* stack[MAXSIDE],p; int top=-1; if(bt==NULL) return; p=bt; while(p==NULL&&top=-1) { while(p!=NULL) { printf("%d",p->data);//入栈前访问节点数据 top++; stack[top]=p;//将节点指针压栈 p=p->lchild;//遍历左子树 } if(top<0) return;//栈空结束 else { p=stack[top]; top--; p=p->rchild;//按栈顶结点遍历右子树 } } }
中序非递归遍历是把访问根节点与右子树写在一起,都放在出栈后。即将printf("%d",p->data);放在p=stack[top]与p->rchild之间。
后序非递归遍历
节点第一次出栈是在左子树后序遍历完之后按照出栈顺序访问右子树,但节点还未访问,所以需要再次入栈,出栈访问节点。
因为第一次出栈与二次进栈相连,所以为了区分,二次进栈时将栈顶元素设为负;
void NRPostOrder(BiTree bt) { BiTNode*stack[MAXSIZE],*p; int top; if(bt==NULL) return; top=-1; p=bt; while(!(p=NULL&&top=-1)) { while(p!=NULL) { top++; stack[top]=p; p=p->lchild;//第一次入栈读左子树 } if(top>-1)//栈不空 if(stack[top]>0) { p=stack[top]->rchild;//读右子树 stack[top]=-stack[top];//二次入栈 } else//右子树读完栈顶元素小于0 { p=-stack[top]; top--; printf("%d",p->data);//读取节点数据 p=NULL; } } }
相关文章推荐
- 数据结构-二叉树操作(创建、先序、中序、后序遍历、计算叶子节点数目、计算二叉树深度、左右子树交换、随机数列产生排序树、查找结点、删除节点、广度遍历、非递归先序遍历)C语言源码(全)
- 数据结构--树:二叉树的遍历方式(递归和非递归)
- C语言二叉树的遍历,递归和非递归
- 二叉树层序遍历(递归与非递归)C语言
- C语言进行二叉树的递归遍历和非递归遍历
- c语言数据结构中二叉树的先序、中序、后序三种递归遍历代码
- Java数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- C语言实现二叉树的递归遍历和非递归遍历
- (C语言)二叉树非递归遍历前序和中序(数据结构十四)
- (C语言)二叉树非递归遍历前序和中序(数据结构十四)
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- 二叉树 先序,中序,后序遍历(递归与非递归)C语言
- 数据结构_二叉树的先序建立与先序,中序,后序(递归)遍历方式_C语言源代码
- 【数据结构】二叉树的遍历(递归与非递归)
- C语言二叉树建立,遍历(递归与非递归),交换子树
- C语言 二叉树的遍历(递归和非递归)
- 递归和非递归俩种方法实现二叉树的前序遍历
- C语言创建二叉树数据结构, 以及各种遍历
- 43 递归和非递归俩种方法实现二叉树的三种遍历