打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
二叉树的三种遍历方式的非递归和递归实现

//二叉树 三种遍历方式的 递归非递归实现

#include
#include

using namespace std;

typedef struct BiTreeNode
{

    intdata;
    BiTreeNode*left;
    BiTreeNode*right;
    

   BiTreeNode()
    {
      left = NULL;
      right =NULL;
    }
}BitTreeNode,*LinkBiTree;

//--------------------先序
void preTraverse( LinkBiTree root) //先序--非递归
{
   if(root == NULL)
    return ;

   BiTreeNode *p = root;
   stack stNode;

   while( p!=NULL ||!stNode.empty() )
   {
       while(p != NULL)
       {
          cout << p->data << " ";

         stNode.push(p);//将每一个遍历的节点入栈,用于遍历右孩子
          p=p->left;
       }

       p=stNode.top();//取栈顶元素
       stNode.pop();//出栈

       p = p->right;
   }
}

void preTraverse2(LinkBiTree root) //先序--递归
{
   if(root == NULL)
     return;

   BiTreeNode *p = root;

   cout << p->data<< " ";
  
   preTraverse2(p->left);

  preTraverse2(p->right);
}

//------中序
void MidTraverse( LinkBiTree root) //中序--非递归
{
   if(root == NULL)
   return;
  
   BiTreeNode *p=root;
   stack stNode;

   while( p!= NULL ||!stNode.empty() )
   {
      while(p!=NULL)
      {
          stNode.push(p);//从根节点到最左边叶子节点入栈
          p=p->left;
      }
      p =stNode.top();//取栈顶元素
     
      cout << p->data << " ";

      stNode.pop();//出栈
      p=p->right;
   }
}

void MidTraverse2(LinkBiTree root) //中序--递归
{
   if(root == NULL)
     return;
  
   BiTreeNode *p = root;

  MidTraverse2(p->left);
  
   cout << p->data<< " ";

  MidTraverse2(p->right);
}

void postTraverse( LinkBiTree root)//后序 非递归
{
    if(root ==NULL)
       return;
 
    stackstNode; 
    BiTreeNode*p = root;
    BiTreeNode*pre = NULL;//记录上次出栈的节点,若是当前节点的右孩子,当前节点出栈,若不是,将当 前节点的右孩子入栈

   while(p!=NULL || !stNode.empty())
    {
         while(p!=NULL)//从根节点开始到最左边叶子节点入栈
         {
            stNode.push(p);
            p=p->left;
          }
         p=stNode.top();
        
         if(p->right!= NULL && p->right !=pre)//存在右孩子,并且有孩子没有入栈(还没访问过)
         {
            p=p->right;
          }
         else
         {
             cout << p->data << " ";
             pre = stNode.top(); //记录本次出栈的元素
             stNode.pop();
              p=NULL;//防止再次入栈
         }
    }
}

void postTraverse2(LinkBiTree root)//后序-递归
{
   if(root == NULL)
    return;
   BiTreeNode *p = root;
  
   postTraverse2(p->left);

  postTraverse2(p->right);

   cout << p->data<< " ";
}


int main()

    BiTreeNode*node = new BiTreeNode[5];
    BiTreeNode*root = node;

   root->left = &node[1];
   root->right = &node[2];
   node[1].right = &node[3];
    node[3].left= &node[4];

 

    for(inti=0;i!=5;++i)
       node[i].data = i;

    preTraverse(root);
    preTraverse2(root);

     

    cout<<endl;

    MidTraverse(root);
   MidTraverse2(root);
 
    cout<<endl;

   postTraverse(root);
   postTraverse2(root);
    return0;
}//二叉树 三种遍历方式的 递归非递归实现

#include
#include

using namespace std;

typedef struct BiTreeNode
{

    intdata;
    BiTreeNode*left;
    BiTreeNode*right;
    

   BiTreeNode()
    {
      left = NULL;
      right =NULL;
    }
}BitTreeNode,*LinkBiTree;

//--------------------先序
void preTraverse( LinkBiTree root) //先序--非递归
{
   if(root == NULL)
    return ;

   BiTreeNode *p = root;
   stack stNode;

   while( p!=NULL ||!stNode.empty() )
   {
       while(p != NULL)
       {
          cout << p->data << " ";

         stNode.push(p);//将每一个遍历的节点入栈,用于遍历右孩子
          p=p->left;
       }

       p=stNode.top();//取栈顶元素
       stNode.pop();//出栈

       p = p->right;
   }
}

void preTraverse2(LinkBiTree root) //先序--递归
{
   if(root == NULL)
     return;

   BiTreeNode *p = root;

   cout << p->data<< " ";
  
   preTraverse2(p->left);

  preTraverse2(p->right);
}

//------中序
void MidTraverse( LinkBiTree root) //中序--非递归
{
   if(root == NULL)
   return;
  
   BiTreeNode *p=root;
   stack stNode;

   while( p!= NULL ||!stNode.empty() )
   {
      while(p!=NULL)
      {
          stNode.push(p);//从根节点到最左边叶子节点入栈
          p=p->left;
      }
      p =stNode.top();//取栈顶元素
     
      cout << p->data << " ";

      stNode.pop();//出栈
      p=p->right;
   }
}

void MidTraverse2(LinkBiTree root) //中序--递归
{
   if(root == NULL)
     return;
  
   BiTreeNode *p = root;

  MidTraverse2(p->left);
  
   cout << p->data<< " ";

  MidTraverse2(p->right);
}

void postTraverse( LinkBiTree root)//后序 非递归
{
    if(root ==NULL)
       return;
 
    stackstNode; 
    BiTreeNode*p = root;
    BiTreeNode*pre = NULL;//记录上次出栈的节点,若是当前节点的右孩子,当前节点出栈,若不是,将当 前节点的右孩子入栈

   while(p!=NULL || !stNode.empty())
    {
         while(p!=NULL)//从根节点开始到最左边叶子节点入栈
         {
            stNode.push(p);
            p=p->left;
          }
         p=stNode.top();
        
         if(p->right!= NULL && p->right !=pre)//存在右孩子,并且有孩子没有入栈(还没访问过)
         {
            p=p->right;
          }
         else
         {
             cout << p->data << " ";
             pre = stNode.top(); //记录本次出栈的元素
             stNode.pop();
              p=NULL;//防止再次入栈
         }
    }
}

void postTraverse2(LinkBiTree root)//后序-递归
{
   if(root == NULL)
    return;
   BiTreeNode *p = root;
  
   postTraverse2(p->left);

  postTraverse2(p->right);

   cout << p->data<< " ";
}


int main()

    BiTreeNode*node = new BiTreeNode[5];
    BiTreeNode*root = node;

   root->left = &node[1];
   root->right = &node[2];
   node[1].right = &node[3];
    node[3].left= &node[4];

 

    for(inti=0;i!=5;++i)
       node[i].data = i;

    preTraverse(root);
    preTraverse2(root);

     

    cout<<endl;

    MidTraverse(root);
   MidTraverse2(root);
 
    cout<<endl;

   postTraverse(root);
   postTraverse2(root);
    return0;
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
二叉树先序、中序、后序遍历的非递归实现
《算法导论》读书笔记之第10章 基本数据结构之二叉树
线索二叉树图文详解
二叉树 非递归遍历 栈实现(前、中后序)
二叉树的非递归遍历 C语言版
更简单的非递归遍历二叉树的方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服