二叉树非递归先序遍历、中序遍历、后序遍历

#include "stdafx.h"
#include <stack>


struct bitreeNode
{
	int value;
	bitreeNode * left;
	bitreeNode * right;
};

//先序
int bitreePreOrder(bitreeNode * root)
{
	stack <bitreeNode *> st;
	bitreeNode * node = root;
	
	do
	{
		while(root)
		{
			printf("%d,", root->value);
			st.push(root);
			root = root->left;
		}

		if(st.size() == 0)
			break;

		root = (bitreeNode *)st.top();
		st.pop();
		root = root->right;
	}
	while(1);

	return 0;

}

//中序 
int bitreeInOrder(bitreeNode * root)
{
	stack <bitreeNode *> st;
	bitreeNode * node = root;
	
	do
	{
		while(root)
		{	
			st.push(root);
			root = root->left;
		}

		if(st.size() == 0)
			break;

		root = (bitreeNode *)st.top();
		st.pop();

		printf("%d", root->value);

		root = root->right;
	}
	while(1);

	return 0;

}


//后序
struct BadIdea{
	bitreeNode * node;
	bool first;
};

int bitreePostOrder(bitreeNode * root)
{
	stack <BadIdea> st;
	BadIdea idea;
	BadIdea node;
	
	do
	{
		while(root)
		{	
			idea.node = root;
			idea.first = true;
			st.push(idea);

			root = root->left;
		}

		if(st.size() == 0)
			break;


		node = (BadIdea)st.top();
		st.pop();

		if(node.first)
		{
			node.first = false;
			root = node.node->right;
			st.push(node);
		}
		else
		{	
			printf("%d", node.node->value);
			root = NULL;
		}
	}
	while(1);

	return 0;

}

#define BITREE_SIZE 10
int _tmain(int argc, _TCHAR* argv[])
{
	bitreeNode * root = (bitreeNode *)malloc(sizeof(bitreeNode) * BITREE_SIZE);
	for(int i=0; i<BITREE_SIZE; i++)
	{
		root[i].value = i;
		if((i * 2 +1) < BITREE_SIZE)
			root[i].left = &(root[i*2+1]);
		else
			root[i].left = NULL;


		if((i * 2 + 2) < BITREE_SIZE)
			root[i].right = &(root[i*2 + 2]);
		else
			root[i].right = NULL;
	}


	bitreePreOrder(root);
	bitreeInOrder(root);
	bitreePostOrder(root);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值