非递归遍历二叉树


// Btree.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include 
#include 

using namespace std;

struct BTree
{
	int m_nValue;
	struct BTree* m_pLeft,*m_pRight;
};
/*后序遍历步骤
1:设置两个指针pPre和pCur分别用于记录之前访问的节点和现在访问的节点,
   均初始化为NULL;设置一个栈用于装节点,首先将根节点入栈
2:将当前节点赋为栈顶元素值,判定
3:若当前节点为叶子节点或其左右子树已经访问过,则访问该节点,并将之前访问的节点赋为该节点值,出栈;
   若当前节点不满足上述情况,则先将其右子节点入栈,再将其左子节点入栈(以便下次先访问左子节点),
   返回2步骤直至栈中已无节点
*/
void postOrder(BTree* pRoot)
{
	if (!pRoot)
	   return;
	cout<<"后序遍历顺序:";
	stack St;
	BTree* pPre = NULL;
	BTree* pCur = pRoot;
	St.push(pCur);
	while(!St.empty())
	{
		pCur = St.top();
		if((!pCur->m_pLeft&&!pCur->m_pRight)||(pPre!=NULL&&(pPre==pCur->m_pLeft||pPre==pCur->m_pRight)))
		{
			cout<m_nValue<<" ";
			St.pop();
			pPre=pCur;
		}
		else
		{
			if (pCur->m_pRight)
			{
				St.push(pCur->m_pRight);
			}
			if (pCur->m_pLeft)
			{
				St.push(pCur->m_pLeft);
			}
		}
	}
}
/*先序遍历二叉树步骤
1:将当前节点赋值为根节点
2:访问当前节点,将当前节点入栈;
3:若左子节点非空,则将当前节点赋值为左子节点值;
   返回步骤2直至左子节点为空;
4:若左子节点为空且栈不为空,则出栈,并将当前节点置为出栈元素的右子节点
   返回步骤2直至当前节点为空且栈空;
*/
void preOrder(BTree* pRoot)
{
   if (!pRoot)
      return;
   	cout<<"先序遍历顺序:";
   stack St;
   BTree* pCur = pRoot;
   while(!St.empty()||pCur)
   {
	   while(pCur)
	   {
		   cout<m_nValue<<" ";
		   St.push(pCur);
		   pCur = pCur->m_pLeft;
	   }
	   if (!St.empty())
	   {
		   pCur = St.top();
		   pCur = pCur->m_pRight;
		   St.pop();
	   }
   }
}

/*中序遍历二叉树步骤
1:将当前节点赋值为根节点
2:将当前节点入栈;
3:若左子节点非空,则将当前节点赋值为左子节点值;
   返回步骤2直至左子节点为空;
4:若左子节点为空且栈不为空,则出栈,并将当前节点置为出栈元素;
   访问当前元素;
   并将当前节点置为其右子节点
   返回步骤2直至当前节点为空且栈空;
*/
void inOrder(BTree* pRoot)
{
	if (!pRoot)
	  return;
	cout<<"后序遍历顺序:";
	BTree* pCur = pRoot;
	stack St;
	while(pCur||!St.empty())
	{
		while(pCur)
		{
			St.push(pCur);
			pCur = pCur->m_pLeft;
		}
		if (!St.empty())
		{
			pCur = St.top();
			cout<m_nValue<<" ";
			pCur = pCur->m_pRight;
			St.pop();
		}

	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	BTree* pTmp = new BTree[8];
	for (int i=0;i<8;i++)
	{
		pTmp[i].m_nValue = i+1;
	}
	pTmp[0].m_pLeft = &pTmp[1];
	pTmp[0].m_pRight = &pTmp[2];
	pTmp[1].m_pLeft = &pTmp[3];
	pTmp[1].m_pRight = &pTmp[4];
	pTmp[3].m_pLeft = NULL;
	pTmp[3].m_pRight = &pTmp[5];
	pTmp[5].m_pLeft = &pTmp[6];
	pTmp[5].m_pRight = NULL;
	pTmp[2].m_pLeft = &pTmp[7];
	pTmp[2].m_pRight = NULL;
	pTmp[6].m_pLeft = pTmp[6].m_pRight = NULL;
	pTmp[7].m_pLeft = pTmp[7].m_pRight = NULL;
	pTmp[4].m_pLeft = pTmp[4].m_pRight = NULL;
	BTree* pRoot = &pTmp[0];
	postOrder(pRoot);
	cout<


非递归遍历二叉树_第1张图片

你可能感兴趣的:(数据结构与算法,面试题)