第13周 关于二叉树的遍历方法

本文介绍了一种使用链式结构实现二叉树的方法,并提供了先序、中序及后序遍历的具体代码实现。文章重点展示了如何通过递归方式创建二叉树及其遍历算法,同时给出了非递归的中序遍历方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:http://blog.youkuaiyun.com/pony_maggie/article/details/38390513

问题及答案:

//链式结构
typdef struct _BiTNode
  {
    int date;
    _BiNode *lchild;
    _BiNode *rchild;
 }BitNode,*pBiTTree;

//创建二叉树,先序顺序
int CreatBiTree(pBiTree *root)
 {
   char ch = 0;
   fflush(stdin);
   if((ch = getchar())=='a') //控制树的结构
    {
      *root = NULL;
    }
   else
    {
       *root = (BiTNote*)malloc(sizeof(BiTNode)); 
       if(!(*root))
        {
          return RET_ERROR;
         }
       (*root)->date = GetRandom();
       CreateBiTree(&(*root))->lChild;
       CreateBiTree(&(*root))->rChild;
      }
   return RET_OK;
}

int g_i = 0; //定义这个的目的?
//创建二叉树,自动执行,方便测试
int CreateBiTreeAuto(pBiTree *root)
 {
   char szOrder[] = "aaabbbccc";
   char ch = 0;
   if(szOrder[g_i++] == 'a') //控制结构
     {
       *root = NULL;
      }
   else
      {
       *root = (BiTNode*)malloc(sizeof(BiTNode));
       if(!(*root))
         {
           return RET_ERROR;  
         }
       (*root)->date = GetRandom();
       CreateBiTreeAuto(&(*root))->lChild;//递归调用
       CreateBiTreeAuto(&(*root))->rChild;
      }
   return RET_OK;
 }
//先序遍历  
int PreOrderVisitTree(pBiTree T, VisitType pFuncVisit)  
{  
    if (T)  
    {  
        (*pFuncVisit)(T->data);  
        if (PreOrderVisitTree(T->leftChild, pFuncVisit) == RET_OK)  
        {  
            if (PreOrderVisitTree(T->rightChild, pFuncVisit) == RET_OK)  
            {  
                return RET_OK;  
            }  
        }  
        return RET_ERROR;  //这里为何返回错误?
    }  
    else  
    {  
        return RET_OK;  
} 

/*中序遍历和后序遍历,非递归方法,
用栈结构存储结点信息,通过出栈访问遍历二叉树*/
int InOrderVisitTree(pBiTree T,VisitType pFuncVisit)
 {
   ponyStack binaryTreeStack; //binary 二进制
   InitStack(&binaryTreeStack,4);
   Push(&binaryTreeStack,&T); //压栈
   pBiTree pTempNote;//临时结点

   while (!IsEmptyStack(binaryTreeStack))
     {
       while((GetTop(binaryTreeStack,&pTempNode) == RET_OK) && (pTempNode != NULL))
        {
          Push(&binaryTreeStack,&pTempNode->leftChild);
         }
          Pop(&binaryTreeStack,&pTempNode);
          if (!IsEmptyStack(binaryTreeStack))
         {
           Pop(&binaryTreeStack,&pTempNode);
           (*pFuncVisit)(pTempNote->date);
           Push(&binaryTreeStack,&(pTempNode->rightChild));
         }
      }
     return RET_OK;
  }
   
 /*代码下载地址:
 http://download.youkuaiyun.com/detail/pony_maggie/7714493
 或
 https://github.com/pony-maggie/BinaryTreeDemo */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值