二叉树的遍历(转)

#include <iostream>
#include <stack>
#include <queue>

using namespace std;

typedef struct Node
{
  int data;
  Node *lchild,*rchild;
}btree;

//创建二叉树

btree *create(int a[],int n, int i)
{
  btree *t;
  if(i>n)
    t=NULL;
  else
  {
    t=new btree;
    t->data=a[i-1];
    t->lchild=create(a,n,2*i);
    t->rchild=create(a,n,2*i+1);
  }

  return t;
}



//递归前序遍历

void preorder(btree *p)
{
  if(p!=NULL)
  {
    cout<<p->data<<endl;
    preorder(p->lchild);
    preorder(p->rchild);
  }
}

//非递归前序遍历

void preorder1(btree *p)
{
  stack<btree *> s;
  while(!s.empty()||p!=NULL)
  {
    while(p!=NULL)
    {
      cout<<p->data<<endl;
      s.push(p);
      p=p->lchild;
    }
    p=s.top();
    s.pop();
    p=p->rchild;
  }
}

//递归中序遍历

void inorder(btree *p)
{
  if(p!=NULL)
  {
    inorder(p->lchild);
    cout<<p->data<<endl;
    inorder(p->rchild);
  }
}

//非递归中序遍历

void inorder1(btree *p)
{
  stack<btree *> s;
  while(!s.empty()||p!=NULL)
  {
    while(p!=NULL)
    {
      s.push(p);
      p=p->lchild;
    }
    p=s.top();
    cout<<p->data<<endl;
    s.pop();
    p=p->rchild;
  }
}

//递归后续遍历

void postorder(btree *p)
{
  if(p!=NULL)
  {
    postorder(p->lchild);
    postorder(p->rchild);
    cout<<p->data<<endl;
  }
}

struct node
{
btree *t;
int flag;
};

//非递归后续遍历

void postorder1(btree *p)
{
  stack<node> s;
  node post;
  while(!s.empty()||p!=NULL)
  {
    while(p!=NULL)
    {
      post.t=p;
      post.flag=0;
      s.push(post);
      p=p->lchild;
    }
    if(!s.empty())
    {
      post=s.top();
      s.pop();
        if(post.flag==0)
        {
          post.flag=1;
          s.push(post);
          p=(post.t)->rchild;
        }
        else
        {
          cout<<(post.t)->data<<endl;
          p=NULL;
        }
    }
  }
}

//非递归层次遍历

void layerorder(btree *p)
{
  queue<btree *>q;
  btree *t;
  if(p!=NULL)
    q.push(p);
  while(!q.empty())
  {
    t=q.front();
    cout<<t->data<<endl;
    q.pop();
    if(t->lchild!=NULL)
      q.push(t->lchild);
    if(t->rchild!=NULL)
      q.push(t->rchild);
  }
}

//交换左右子树

void exchange(btree *p)
{
  btree *t;
  if(p!=NULL)
  {
    t=p->lchild;
    p->lchild=p->rchild;
    p->rchild=t;
    exchange(p->lchild);
    exchange(p->rchild);
  }
}

int main()
{
  btree *root;
  int a[7]={1,2,3,4,5,6,7};
  root=create(a,7,1);
  cout<<"preorder:"<<endl;
  preorder(root);
  cout<<"preorder1:"<<endl;
  preorder1(root);
  cout<<"inorder"<<endl;
  inorder(root);
  cout<<"inorder1"<<endl;
  inorder1(root);
  cout<<"postorder"<<endl;
  postorder(root);
  cout<<"postorder1"<<endl;
  postorder1(root);
  cout<<"layerorder"<<endl;
  layerorder(root);
  exchange(root);
  cout<<"After exchange(layerorder):"<<endl;
  layerorder(root);
  return 0;
}


 
 



转载于:https://www.cnblogs.com/jasonliu/archive/2012/03/20/2407789.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值