二叉树的三种遍历方法

/******************定义二叉树**************************/
//链式存储
struct BinaryTreeNode
{
	int mValue;
	BinaryTreeNode* mLeft;
	BinaryTreeNode* mRight;
};
//顺序存储
struct BinaryTreeNode
{
	int data[MAX_SIZE];
	int length;
}

/******************递归实现***************************/
//先序遍历
int PreOrderTreeWalk(BinaryTreeNode* pNode)
{
	if(pNode == NULL)
		return 0;
	printf(pNode->mValue);
	PreOrderTreeWalk(pNode->mLeft);
	PreOrderTreeWalk(pNode->mRight);
	return 1;
}

//中序遍历
int InOrderTreeWalk(BinaryTreeNode* pNode)
{
	if(pNode == NULL)
		return 0;
	PreOrderTreeWalk(pNode->mLeft);
	printf(pNode->mValue);
	PreOrderTreeWalk(pNode->mRight);
	return 1;
}

//后序遍历
int PostOrderTreeWalk(BinaryTreeNode* pNode)
{
	if(pNode == NULL)
		return 0;
	PreOrderTreeWalk(pNode->mLeft);
	PreOrderTreeWalk(pNode->mRight);
	printf(pNode->mValue);
	return 1;
}

/*****************非递归实现***********************/
//先序遍历
int PreOrderTreeWalk(BinaryTreeNode* pNode)
{
	std::Stack<BinaryTreeNode*> stack;
	if(pNode == NULL)
		return 0;

	while(!stack.empty()||pNode)
	{
		while(pNode)
		{
			//先访问
			printf(pNode->mValue);
			stack.push(pNode);
			//遍历左节点
			pNode = pNode->mLeft;
		}
		//弹出根节点
		pNode = stack.top();
		stack.pop();
		//遍历右节点
		pNode = pNode->mRight;	
	}
}

//中序遍历
int int InOrderTreeWalk(BinaryTreeNode* pNode)
{
	std::Stack<BinaryTreeNode*> stack;
	if(pNode == NULL)
		return 0;
	
	while(!stack.empty()||pNode)
	{
		while(pNode!=NULL)
		{
			stack.push(pNode);
			pNode = pNode->mLeft;
		}
		pNode = stack.top();
		stack.pop();
		printf(pNode->mValue);
		pNode = pNode->mRight;	
	}
}

//后序遍历,用一个标记标记右子树是否访问过 
int PostOrderTreeWalk(BinaryTreeNode* pNode)
{
	std::Stack<BinaryTreeNode*> stack;
	boolean flag[MAX_SIZE];
	if(pNode == NULL)
		return 0;
	stack.push(pNode);
	flag[stack.size()-1] = false;
	while(!stack.empty()||pNode)
	{
		pNode = stack.top();
		//左子树入栈,初始化
		while(pNode)
		{
			stack.push(pNode);
			flag[stack.size()-1] = false;//标记此时该节点右子树并未被访问
			pNode = pNode-> mLeft;
		}
		//访问到最左节点
		pNode = stack.top();
		//访问右子树
		if(pNode->mRight&&!flag[stack.size()-1])
		{
			flag[stack.size()-1] = true;
			pNode = pNode-> mRight;
		}
		else
		{
			pNode = stack.top();
			stack.pop();
			printf(pNode->mValue);
		}	
	}	
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值