每天一道算法题(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);
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值