二叉树的四种的非递归遍历算法
1 #include <iostream> 2 #include <stack> 3 #include <queue> 4 using namespace std; 5 typedef struct BinTree 6 { 7 int data; 8 BinTree *lc; 9 BinTree *rc; 10 }BTNode,*BinTree; 11 12 //中序遍历的非递归算法 13 void InOrder(BinTree T) 14 { 15 stack<BinTree> s; 16 BinTree P = T; 17 while(p||!s.empty())//只要有一个满足即可,此时p不为空 18 { 19 if(p) 20 { 21 s.push(p); 22 p = p->lc; 23 } 24 else 25 { 26 p = s.top();//访问栈顶 27 s.pop(); 28 cout<<p->data<<endl;//访问 29 p = p->rc; 30 } 31 } 32 33 } 34 35 //先序遍历的非递归算法 36 void PreOrder(BinTree T) 37 { 38 stack<BinTree> s; 39 BinTree p = T; 40 while(p||!s.empty()) 41 { 42 if(p) 43 { 44 cout<<p->data<<endl;//访问 45 s.push(p); 46 p = p->lc; 47 }else 48 { 49 p = s.top();//访问栈顶 50 s.pop(); 51 p = p->rc; 52 } 53 } 54 } 55 56 57 //后序遍历的非递归算法 58 void PostOrder(BinTree T) 59 { 60 stack<BinTree> s; 61 BinTree p = T,r = NULL; 62 while(p||!s.empty()) 63 { 64 if(p) 65 { //从根节点向左边走 66 s.push(p); 67 p = p->lc; 68 } 69 else 70 { //左边走不通向右走 71 p = s.top(); 72 if(p->rc&&p->rc!=r)//如果右子树存在,且未被访问过 73 { 74 p = p->rc; 75 s.push(p); 76 p = p->lc; 77 }else 78 { 79 p=s.top(); 80 s.pop(); 81 cout<<p->data<<endl; 82 r=p; //记录最近访问的节点 83 p=NULL; //节点访问完之后,重置p指针,目的是为了防止再次将左孩子压栈 84 } 85 } 86 } 87 } 88 89 //层次遍历的非递归算法 90 91 void LevelOrder(BinTree T) 92 { 93 if(T==NULL) 94 return; 95 queue<BinTree> q; 96 q.push(T); //根节点压栈 97 BinTree p; 98 while(!q.empty()) 99 { 100 p = q.front(); //获取队头 101 q.pop(); 102 cout<<p->data<<endl;//访问 103 if(p->lc) 104 q.push(p->lc); 105 if(p->rc) 106 q.push(p->rc); 107 108 } 109 }
手与大脑的距离决定了理想与现实的相似度