【算法】二叉樹各種遍歷


// 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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章