常用数据结构---非递归中序遍历二叉树(利用栈)

// Tree.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;
const int STACKSIZE = 10;
const int INCREASEMENT = 10;

enum Symbol
{
 Success,
 Fail
};

//TreeNode
typedef struct tagTreeNode
{
 int n;
 struct tagTreeNode *pLeft,*pRight;  //二叉树的左子树右子树
}TreeNode_S;

//typedef int Elemtype;
//Stack 数据结构
typedef struct tagStack
{
 int nStackSize;
 TreeNode_S *pBase,*pTop;
}Stack_S;


//初始化栈
int InitStack(Stack_S &Stack)
{
 Stack.pBase = (TreeNode_S *)malloc(STACKSIZE*sizeof(TreeNode_S));
 if (Stack.pBase == NULL)
 {
  return Fail;
 }
 Stack.pTop = Stack.pBase; //空栈
 Stack.nStackSize = STACKSIZE;
 return Success;
}

//判断是否空栈
bool StackEmpty(Stack_S Stack)
{
 if (Stack.pBase == Stack.pTop)
 {
  return true;
 }
 else
  return false; 
}

//在用动态数组实现的栈中,如果栈的空间不够用时,我们用realloc运行时动态增加了空间,
//这时指向原空间栈底的指针会伴随着使用realloc而自动更新,
//但是指向原空间栈顶的指针却不会自动更新到新空间去,这时我们就必须手动更新这个栈顶指针了!
//realloc 并不保证返回和原来一样的地址..无论调用几次 realloc,最后我们只需一次 free。

//进栈
int PushStack(Stack_S &Stack, TreeNode_S *TreeNode)
{
 if (Stack.pTop - Stack.pBase >= Stack.nStackSize - 1) //申请空间
 {
  Stack.pBase = (TreeNode_S *)realloc(Stack.pBase, (Stack.nStackSize + INCREASEMENT)*sizeof(TreeNode_S));
  Stack.pTop = Stack.pBase + Stack.nStackSize - 1;  //使用realloc必须重设top指针
  Stack.nStackSize += INCREASEMENT;
 }
 *Stack.pTop++ = *TreeNode;
 return Success;
}

//出栈
int PopStack(Stack_S &Stack, TreeNode_S *TreeNode)
{
 if (Stack.pBase == Stack.pTop)
 {
  return Fail;
 }
 *TreeNode = *--Stack.pTop;
 return Success;
}

int _tmain(int argc, _TCHAR* argv[])
{
 Stack_S StackObj;  //栈对象
 //初始化二叉树
 TreeNode_S *pTreeNode1 = new TreeNode_S;
 pTreeNode1->n = 1;
 pTreeNode1->pLeft = NULL;
 pTreeNode1->pRight = NULL;
 TreeNode_S *pTreeNode2 = new TreeNode_S;
 pTreeNode2->n = 2;
 pTreeNode2->pLeft = NULL;
 pTreeNode2->pRight = NULL;
 TreeNode_S *pTreeNode3 = new TreeNode_S;
 pTreeNode3->n = 3;
 pTreeNode3->pLeft = NULL;
 pTreeNode3->pRight = NULL;
 TreeNode_S *pTreeNode4 = new TreeNode_S;
 pTreeNode4->n = 4;
 pTreeNode4->pLeft = NULL;
 pTreeNode4->pRight = NULL;

 //建树
 pTreeNode1->pLeft = pTreeNode2;
 pTreeNode1->pRight = pTreeNode3;
 pTreeNode2->pRight = pTreeNode4;

 TreeNode_S *TreeNodeTemp = pTreeNode1;  //根结点

 //调用栈中序遍历树(非递归)
 InitStack(StackObj);
 while (TreeNodeTemp || !StackEmpty(StackObj))
 {
  if (TreeNodeTemp)
  {
   PushStack(StackObj, TreeNodeTemp);
   TreeNodeTemp = TreeNodeTemp->pLeft;
  }
  else
  {
   //TreeNode_S TreeNodeTemp;
   TreeNode_S *pTreeNode = new TreeNode_S;
   PopStack(StackObj, pTreeNode);
   cout<<pTreeNode->n<<endl;
   TreeNodeTemp = pTreeNode;
   TreeNodeTemp = TreeNodeTemp->pRight;
   delete pTreeNode;
   pTreeNode = NULL;
  }
 }

 //释放资源
 if (pTreeNode1)
 {
  delete pTreeNode1;
  pTreeNode1 = NULL;
 }
 if (pTreeNode2)
 {
  delete pTreeNode2;
  pTreeNode2 = NULL;
 }
 if (pTreeNode3)
 {
  delete pTreeNode3;
  pTreeNode3 = NULL;
 }
 if (pTreeNode4)
 {
  delete pTreeNode4;
  pTreeNode4 = NULL;
 }
 if (StackObj.pBase)
 {
  free(StackObj.pBase);
  StackObj.pBase = NULL;
  StackObj.pTop = NULL;
 }

 system("pause");
 return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值