一步两步学算法之树的遍历 非递归实现
递归的程序其实我觉得可读性较高 但是执行效率低下
为了做一道PAT的题 去理解了下非递归实现树的遍历
用一个栈来实现
先序遍历
先访问节点 再把节点push进栈 再访问 再push 直到next=NULL
然后pop出一个节点 也就是弹出一个节点 访问它的右边 再弹出 在访问
中序遍历
把左边节点全部push进栈 然后弹出 访问中间 再访问右边 再弹出 一直循环
后序遍历
比较难理解 要入两次栈才能访问 先左边全部入栈 栈顶是左边的元素 此书不能访问 因为右边还没入栈
下面给出先序和后序的代码 后序的代码 记得调试下看看 不然很难理解
给出一张图片便于理解 来自c语言中文网
void NRpreOrder(BiTree bt) { BiTree stack[MXSNODE],p; int top; if(bt==NULL) return; top=0; p=bt; while(!(p==NULL &&top==0)) { while(p!=NULL) { visit(p->data); //访问节点数据 if(top<MAXNODE-1) { stack[top]=p; //访问后的节点进栈 top++; } else { printf("栈溢出"); return; } p=p->left; //指向下一个 } if(top<=0) return; else{ top--; p=stack[top]; //弹出节点 p=p->right; //指向右边 } } }
1 #include "stdio.h" 2 #define MXSNODE 10 3 typedef struct Bitree 4 { 5 int data; 6 struct Bitree *left; 7 struct Bitree *right; 8 }BiTree; 9 10 typedef struct 11 { 12 BiTree *link; 13 int flag; 14 }stacktype; 15 16 void NRpreOrder(BiTree *bt) 17 { 18 stacktype stack[MXSNODE]; 19 BiTree *p; 20 int top,sign; 21 if(bt==NULL) 22 return; 23 top=-1; 24 p=bt; 25 while(!(p==NULL &&top==-1)) 26 { 27 if(p!=NULL) 28 { 29 top++; 30 stack[top].link=p; 31 stack[top].flag=1; 32 p=p->left; 33 } 34 else 35 { 36 p=stack[top].link; 37 sign=stack[top].flag; 38 top--; 39 40 if(sign==1) 41 { 42 top++; 43 stack[top].link=p; 44 stack[top].flag=2; 45 p=p->right; 46 } 47 else{ 48 printf("%d",p->data); 49 } 50 } 51 } 52 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。