二叉树循环遍历

下面是基于的二叉树循环遍历代码:

#include <stack>
#include <queue>
#define New(type) (type*)malloc(sizeof(type))
struct BinaryTreeNode {
	int value;
	struct BinaryTreeNode *left;
	struct BinaryTreeNode *right;
};
void preOrder_loop(BinaryTreeNode *tree) {
	if (NULL == tree) {
		return;
	}
	std::stack<BinaryTreeNode*> treeStack;
	while (tree || !treeStack.empty()) {
		if (tree) {
			printf("%d ", tree->value);
			if (tree->right)
				treeStack.push(tree->right);
			tree = tree->left;
		}
		else {
			tree = treeStack.top();
			treeStack.pop();
		}
	}
}
void inOrder_loop(BinaryTreeNode *tree) {
	if (NULL == tree) {
		return;
	}
	std::stack<BinaryTreeNode*> treeStack;
	while (tree || !treeStack.empty()) {
		if (tree) {
			treeStack.push(tree); //把沿途结点入栈, 这些结点的值没有打印, 其右子树没有访问
			tree = tree->left; //往左走到底
		}
		else {
			tree = treeStack.top(); //弹一个结点出来
			treeStack.pop();
			printf("%d ", tree->value); //打印值
			tree = tree->right; //访问右子树
		}
	}
}
void postOrder_loop(BinaryTreeNode *tree) {
	if (NULL == tree) {
		return;
	}
	std::stack<BinaryTreeNode*> treeStack;
	while (tree || !treeStack.empty()) {
		if (tree) {
			treeStack.push(tree); //把沿途结点入栈, 这些结点的右子树没有访问, 其值没有打印
			tree = tree->left; //往左走到底
		}
		else { //某个结点的左子树或左右子树已经访问完毕
			tree = treeStack.top(); //弹一个结点出来
			treeStack.pop();
			if (NULL == tree) {
				tree = treeStack.top();
				treeStack.pop();
				printf("%d ", tree->value);
				tree = NULL; //以该结点为根的子树已经遍历完毕
			}
			else {
				treeStack.push(tree);
				treeStack.push(NULL);
				tree = tree->right; //访问右子树
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值