C++ 二叉树非递归遍历(别贪心,一次循环访问一个节点,前序遍历2例外)

前序遍历方法1:

void preOrder1(BiNode * rootN)
{
	if (rootN != nullptr)
	{
		stack<BiNode*> nodeSta;
		nodeSta.push(rootN);
		BiNode* curNode;
		while(!nodeSta.empty())
		{
			curNode = nodeSta.top();
			nodeSta.pop();
			cout << curNode->val << " ";
			if(curNode->right != nullptr)
				nodeSta.push(curNode->right);
			if(curNode->left != nullptr)
				nodeSta.push(curNode->left);
		}
	}
	cout << endl;
}

前序遍历方法2:

void preOrder2(BiNode* rootN)
{
	stack<BiNode*> nodeSta;
	BiNode* curNode = rootN;
	while(!nodeSta.empty() || curNode != nullptr)
	{
		while(curNode)
		{
			cout << curNode->val << " ";
			nodeSta.push(curNode);
			curNode = curNode->left;
		}

		if (!nodeSta.empty())
		{
			curNode = nodeSta.top();
			nodeSta.pop();
			curNode = curNode->right;
		}
	}
	cout << endl;
}

中序遍历:

void inOrder1(BiNode* rootN)
{
	stack<BiNode*> nodeSta;
	BiNode* curNode = rootN;
	while(curNode || !nodeSta.empty())
	{
		while(curNode)
		{
			nodeSta.push(curNode);
			curNode = curNode->left;
		}

		curNode = nodeSta.top();
		nodeSta.pop();
		cout << curNode->val << " ";

		curNode = curNode->right;

	}
	cout << endl;
}

后序遍历方法1(单栈):

void postOrder1(BiNode* rootN)
{
	BiNode *preNode = nullptr;//上一次打印的节点
	BiNode *curNode = rootN;
	stack<BiNode*> nodeSta;
	while(curNode || !nodeSta.empty())
	{
		while(curNode)
		{
			nodeSta.push(curNode);
			curNode = curNode->left;
		}

		BiNode *topNode = nodeSta.top();
		
		//如果结点的右孩子为空,或者右孩子已经被打印,则可以打印本结点
		if (topNode->right == nullptr || preNode == topNode->right)
		{
			cout << topNode->val << " ";//任一个节点都是被假想成根节点打印的
			nodeSta.pop();
			preNode = topNode;//注意 不要给curNode赋值,它就该为nullptr
		}
		else
			curNode = topNode->right;
	}
	cout << endl;
}

后序遍历方法2(双栈):

void postOrder2(BiNode* rootN)
{
	stack<BiNode*> nodeSta1,nodeSta2;
	BiNode* curNode = rootN;
	nodeSta1.push(rootN);
	while(!nodeSta1.empty())
	{
		curNode = nodeSta1.top();
		nodeSta1.pop();
		nodeSta2.push(curNode);
		if(curNode->left) nodeSta1.push(curNode->left);
		if(curNode->right) nodeSta1.push(curNode->right);
	}
	while(!nodeSta2.empty())
	{
		curNode = nodeSta2.top();
		nodeSta2.pop();
		cout << curNode->val << " ";
	}
	cout << endl;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值