二叉树非递归遍历

本文详细介绍了如何使用非递归方式实现二叉树的前序、中序和后序遍历。通过堆栈辅助,避免了递归带来的调用栈开销,提供了一种更高效的方法来遍历二叉树结构。同时,给出了具体的C语言代码实现,包括先序遍历和中序遍历的非递归版本。
摘要由CSDN通过智能技术生成

二叉树

非递归遍历原理

在这里插入图片描述

  • 在前序遍历中
  • 遇到结点就打印,在讲结点放进堆栈
  • 当结点为空,将结点弹出堆栈在访问结点的右子树
  • 再循环步骤
中序遍历
  • 中序遍历中
  • 遇到结点先保存在堆栈里面
  • 当结点空的时候 我们将堆栈抛出结点 在打印结点 在访问结点的右子树
  • 循环
创建一颗二叉树

在这里插入图片描述

代码
#include<stdio.h>
#include<stdlib.h>
typedef char ElmentType;
typedef struct Tnode{
  struct Tnode *Left;
  struct Tnode *Right;
  ElmentType data;
}Tnode;
typedef Tnode* Tree;
Tree CreateTree() ;
void Preoreder(Tree T);
void Inoreder(Tree T);
void Backoreder(Tree T);
void FInOrderTraverse(Tree BT);
void FPreOrderTraverse(Tree BT) ;
int main()
{
  Tree T = CreateTree();
  Preoreder(T);   
  printf("\n");
  FPreOrderTraverse(T);

  return 0;

}

Tree CreateTree()  //返回根结点的地址
{
      Tree root = NULL;
      char ch;
      scanf("%c",&ch); //

      if( ch!= '#')
      {
          root = (Tree)malloc(sizeof(Tnode));
          root->data = ch;

          root->Left = CreateTree();
          root->Right = CreateTree();
      }else{
          root = NULL;
      }
      return root; //返回根节点
}

void Preoreder(Tree T)
{
  if(T!=NULL)
  {
      printf("%c",T->data);
      Preoreder(T->Left);
      Preoreder(T->Right);
  }else{
      return ;
  }
}
void Inoreder(Tree T)
{
  if(T!=NULL)
  {
      Inoreder(T->Left);
      printf("%c",T->data);
      Inoreder(T->Right);
  }else{
      return ;
  }
}

void Backoreder(Tree T)
{
  if(T!=NULL)
  {
      Backoreder(T->Left);
      Backoreder(T->Right);
      printf("%c",T->data);
  }else{
      return ;
  }
}

void FInOrderTraverse(Tree BT)  //先序遍历二叉树
{
      Tnode* stk[2000];
      Tnode* node = BT;
     int stk_top = 0;
     while( stk_top > 0 || node!= NULL)
     {
      
             while( node!=NULL)
             {
                    stk[stk_top++] = node ;//将结点地址P Push  Stack S
                     node = node->Left; //
             }
             if(node == NULL)
             {
                     node = stk[--stk_top]; //结点弹出堆栈
                     printf("%5c",node->data);//访问打印结点
                     node = node->Right;
                  }
     }
       
}
void FPreOrderTraverse(Tree BT)  //先序遍历二叉树
{
      Tnode* stk[2000];
      Tnode* node = BT;
     int stk_top = 0;
     while( stk_top > 0 || node!= NULL)
     {
      
             while( node!=NULL)
             {
                    stk[stk_top++] = node ;//将结点地址P Push  Stack S
                     printf("%5c",node->data);//访问打印结点
                     node = node->Left; //
             }
             if(node == NULL)
             {
                     node = stk[--stk_top]; //结点弹出堆栈
                     node = node->Right;
                  }
     }
       
}
非递归先序代码实现
void FPreOrderTraverse(Tree BT)  //先序遍历二叉树
{
        Tnode* stk[2000];
        Tnode* node = BT;
       int stk_top = 0;
       while( stk_top > 0 || node!= NULL)
       {
        
               while( node!=NULL)
               {
                      stk[stk_top++] = node ;//将结点地址P Push  Stack S
                       printf("%5c",node->data);//访问打印结点
                       node = node->Left; //
               }
               if(node == NULL)
               {
                       node = stk[--stk_top]; //结点弹出堆栈
                       node = node->Right;
                    }
       }
         
}
非递归代码中序
void FInOrderTraverse(Tree BT)  //先序遍历二叉树
{
        Tnode* stk[2000];
        Tnode* node = BT;
       int stk_top = 0;
       while( stk_top > 0 || node!= NULL)
       {
        
               while( node!=NULL)
               {
                      stk[stk_top++] = node ;//将结点地址P Push  Stack S
                       node = node->Left; //
               }
               if(node == NULL)
               {
                       node = stk[--stk_top]; //结点弹出堆栈
                       printf("%5c",node->data);//访问打印结点
                       node = node->Right;
                    }
       }
         
}
非递归后序代码

待完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值