【算法】二叉树各种遍历


// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
using namespace std;
const int MAXSIZE = 10;
int i = 0;
int da[] = { 3, 1, 2, -1, -1, -1, 4, 6, -1, -1, 7, -1, -1 };
typedef struct BNode{
 int data;
 struct BNode*rchild, *lchild;
}BNode;
typedef struct QNode{
 BNode* data[MAXSIZE];
 int front, rear;
}QNode;
void Init(QNode*&Q)//初始化队列
{
 Q = (QNode*)malloc(sizeof(QNode));
 Q->front = Q->rear = 0;
}
int Push(QNode*Q, BNode* x)//入队列
{
 if ((Q->rear + 1) % MAXSIZE == Q->front)
  return 0;
 else
 {
  Q->data[(Q->rear + 1) % MAXSIZE] = x;
  Q->rear = (Q->rear + 1) % MAXSIZE;
  return 1;
 }
}
int Pop(QNode*Q, BNode* &x)//出队列
{
 if (Q->front == Q->rear)
  return 0;
 else
 {
  x = Q->data[(Q->front + 1) % MAXSIZE];
  Q->front = (Q->front + 1) % MAXSIZE;
  return 1;
 }
}
void CreateBtree(BNode* &p)//中序遍历建立二叉树
{
 int data;
 //cin >> data;
 data = da[i++];
 if (data != -1)
 {

  p = (BNode*)malloc(sizeof(BNode));
  p->data = data;
  
  CreateBtree(p->lchild);
  CreateBtree(p->rchild);
 }
 else
 {
  p = NULL;
 }
  
 
}
int VisitFirst(BNode*p)//递归先序遍历
{
 if (p)
 {
  cout << p->data << ' ';
  VisitFirst(p->lchild);
  
  VisitFirst(p->rchild);
  return 1;
 }
 else
  return 0;
}
int VisitMid(BNode*p)//递归中序遍历
{
 if (p)
 {
  
  VisitMid(p->lchild);
  cout << p->data << ' ';
  VisitMid(p->rchild);
  return 1;
 }
 else
  return 0;
}
int VisilLast(BNode*p)//递归后序遍历
{
 if (p)
 {
  VisilLast(p->lchild);
  VisilLast(p->rchild);
  cout << p->data << ' ';
  return 1;
 }
 else
  return 0;
}
int Visit(BNode *p)//层序遍历
{
 QNode *q;
 BNode *m;
 Init(q);
 if (p)
 {
  Push(q, p);
  while (q->front != q->rear)//判断队列是否为空
  {
   Pop(q, m);
   cout << m->data << ' ';
   if (m->lchild)
    Push(q, m->lchild);
   if (m->rchild)
    Push(q, m->rchild);
  }
  return 1;
 }
 else
  return 0;

}
int VisitFirst1(BNode*p)//非递归先序遍历
{
 if (p)
 {
  BNode* Stack[MAXSIZE];
  int top = -1;
  Stack[++top] = p;
  BNode*m;
  while (top!=-1)
  {
   m = Stack[top--];
   cout << m->data << ' ';
   if (m->rchild)
    Stack[++top] = m->rchild;
   if (m->lchild)
    Stack[++top] = m->lchild;
  }

  return 1;
 }
 else
 {
  return 0;
 }
}
int VisitLast1(BNode*p)//非递归后序遍历
{
 if (p)
 {
  BNode* Stack1[MAXSIZE], *Stack2[MAXSIZE];
  int top1=-1, top2=-1;
  Stack1[++top1] = p;
  BNode*m;
  while (top1!=-1)
  {
   m = Stack1[top1--];
   Stack2[++top2] = m;
   if (m->lchild)
    Stack1[++top1]=m->lchild;
   if (m->rchild)
    Stack1[++top1] = m->rchild;
  }
  while (top2!=-1)
  {
   cout << Stack2[top2--]->data << ' ';
  }
  return 1;
 }
 else
  return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
 BNode *p;
 CreateBtree(p);
 cout << "先序遍历:";
 VisitFirst(p);
 cout << "\n中序遍历:";
 VisitMid(p); 
 cout << "\n后序遍历:";
 VisilLast(p);
 cout << "\n层序遍历:";
 Visit(p);
 cout << "\n非递归先序遍历:";
 VisitFirst1(p);
 cout << "\n非递归后序遍历:";
 VisitLast1(p);
 cout << endl;
 return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值