树的非递归(前序,中序,后序)

#include<stdio.h>
#include <stdlib.h>


typedef struct _Tree
{
 int nValue;
 struct _Tree* pLeft;
 struct _Tree* pRight;
}Tree;    //  树的节点

void CreateTree(Tree* *tree)
{
 (*tree) = (Tree*)malloc(sizeof(Tree));
 (*tree)->nValue = 1;


 (*tree)->pLeft = (Tree*)malloc(sizeof(Tree));
 (*tree)->pLeft->nValue = 2;


 (*tree)->pLeft->pLeft = (Tree*)malloc(sizeof(Tree));
 (*tree)->pLeft->pLeft->nValue = 4;
 (*tree)->pLeft->pLeft->pLeft = NULL;
 (*tree)->pLeft->pLeft->pRight = NULL;


 (*tree)->pLeft->pRight = (Tree*)malloc(sizeof(Tree));
 (*tree)->pLeft->pRight->nValue = 5;
 (*tree)->pLeft->pRight->pLeft = NULL;
 (*tree)->pLeft->pRight->pRight = NULL;

 

 (*tree)->pRight = (Tree*)malloc(sizeof(Tree));
 (*tree)->pRight->nValue = 3;


 (*tree)->pRight->pLeft = (Tree*)malloc(sizeof(Tree));
 (*tree)->pRight->pLeft->nValue = 6;
 (*tree)->pRight->pLeft->pLeft = NULL;
 (*tree)->pRight->pLeft->pRight = NULL;


 (*tree)->pRight->pRight = (Tree*)malloc(sizeof(Tree));
 (*tree)->pRight->pRight->nValue = 7;
 (*tree)->pRight->pRight->pLeft = NULL;
 (*tree)->pRight->pRight->pRight = NULL;
}


typedef struct _Stack
{
 Tree* pTree;    //  装一个树的节点
 struct _Stack* pNext;
}Stack;

void PushStack(Stack* *pTop,Tree* tree)
{
 Stack* temp = (Stack*)malloc(sizeof(Stack));
 temp->pTree = tree;

 temp->pNext = (*pTop);
 (*pTop) = temp;
}


Tree* PopStack(Stack* *pTop)
{
 if (pTop == NULL || *pTop == NULL)
 {
  return NULL;
 }

 Stack* pDel = (*pTop);
 Tree* tree = pDel->pTree;
 (*pTop) = (*pTop)->pNext;
 free(pDel);
 pDel = NULL;

 return tree;
}

void FrontPrintf(Tree* tree)
{
 Stack* pTop = NULL;

 while(1)
 {
  while(tree)    // 把 tree  所有的左 放到栈
  {
   //   根
   printf("%d ",tree->nValue);
   //   左子树
   PushStack(&pTop,tree);

   tree = tree->pLeft;
  }

  //  左遍历 完了
  //   通过出栈的节点  遍历右
  tree = PopStack(&pTop);

  if (tree == NULL)    //  栈没有东西  遍历完 结束
  {
   return;
  }
  
  //  遍历 右子树
  tree = tree->pRight;
 }
}


void MidPrintf(Tree* tree)
{
 Stack* pTop = NULL;

 while(1)
 {
  while(tree)    // 把 tree  所有的左 放到栈
  {
   //   左子树
   PushStack(&pTop,tree);

   tree = tree->pLeft;
  }

  //  左遍历 完了
  //   通过出栈的节点  遍历右
  tree = PopStack(&pTop);

  if (tree == NULL)    //  栈没有东西  遍历完 结束
  {
   return;
  }
  //   根
  printf("%d ",tree->nValue);
  //  遍历 右子树
  tree = tree->pRight;
 }
}

 

int main()
{
 Tree* root = NULL;
 CreateTree(&root);

 FrontPrintf(root);

 printf("\n");

 MidPrintf(root);

 system("pause");
 return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值