每天一道算法题(38)——二叉树的非递归遍历

来源:互联网 发布:vb msg 编辑:程序博客网 时间:2024/05/21 18:40
#include<iostream>#include "stack"using namespace std;struct node{char c;node* left;node *right;bool flag;};void pre(node* head){//非递归前序遍历stack<node*> s;while (head || !s.empty()){if (head){cout << head->c;s.push(head);head = head->left;}else{head = s.top()->right;s.pop();}}}void middle(node* head){//非递归中序遍历stack<node*> s;node* p;while (head || !s.empty()){if (head){s.push(head);head = head->left;}else{p = s.top();cout << p->c;s.pop();head = p->right;}}}  void post(node* head){//非递归后序遍历node* p;stack<node*> s;while (head || !s.empty()){if (head){s.push(head);head = head->left;}else{p = s.top();if (p->flag){cout << p->c;s.pop();}else{head = p->right;p->flag = true;//代表右子树已经访问过}}}}int main(int argc, char **argv){node f = { 'f', 0, 0, false };node e = { 'e', &f, 0, false };node d = { 'd', 0, 0, false };node b = { 'b', &d, &e, false };node g = { 'g', 0, 0, false };node c = { 'c', 0, &g, false };node a = { 'a', &b, &c, false };pre(&a);cout << endl;middle(&a);cout << endl;post(&a);}

0 0
原创粉丝点击