攻城狮凌风

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

#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);
}

posted on 2015-10-13 20:46  攻城狮凌风  阅读(166)  评论(0编辑  收藏  举报

导航