二叉树三种遍历算法递归和非递归实现

来源:互联网 发布:软件压力测试报告 编辑:程序博客网 时间:2024/05/29 01:52

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

#include
#include

using namespace std;

typedef struct BiTreeNode
{

    int data;
    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;
 
    stack stNode; 
    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(int i=0;i!=5;++i)
        node[i].data = i;

     preTraverse(root);
     preTraverse2(root);

     

    cout <<endl;

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

    postTraverse(root);
    postTraverse2(root);
    return 0;
}

0 0