您的位置:首页 > 理论基础 > 数据结构算法

二叉树遍历 - 数据结构

2012-06-21 11:13 225 查看


1. 二叉树遍历

1.1 遍历算法:

1.先序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1) 访问根结点;

  (2) 遍历左子树;

  (3) 遍历右子树。

2.中序遍历的递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1)遍历左子树;

  (2)访问根结点;

  (3)遍历右子树。

3.后序遍历得递归算法定义:

  若二叉树非空,则依次执行如下操作:

  (1)遍历左子树;

  (2)遍历右子树;

  (3)访问根结点。

4.层次遍历:层序遍历(level traversal)二叉树的操作定义为:

若二叉树为空,则退出,否则,

按照树的结构,从根开始自上而下,自左而右访问每一个结点,从而实现对每一个结点的遍历

例子:表达式a + b × (c- d)- e/ f



先序遍历:- + a * b
-
c d / e f

中序遍历:a + b * c - d- e / f

后续遍历:a b c d - × + e f /-

1.2遍历算法实现:

基本操作实现 stdafx.h:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

#include <stdio.h>
#include "stdlib.h"
#include <iostream>
using namespace std;

//宏定义
#define TRUE   1
#define FALSE   0
#define OK    1
#define ERROR   0
#define INFEASIBLE -1
#define OVERFLOW -2
#define STACKEMPTY -3
#define QUEUEEMPTY  -3

#define MAX 10 // MAXIMUM STACK CONTENT
#define MAX_QUEUE 10 // MAXIMUM QUEUE CONTENT

typedef int Status;
typedef char ElemType;

//而二叉树
typedef struct BitNode{
ElemType data;
Status visited;
struct BitNode *lchild, *rchild; //左右孩子指针
}BitNode, *BiTree;

typedef BiTree StackElemType;
typedef BiTree QueueElemType;

class stack
{
private:
StackElemType arr[MAX];
int top;
public:
stack()
{
inItStack();
}
/************************************************************************/
/* 初始化栈                                                                     */
/************************************************************************/
void inItStack()
{
top=-1;
}
/************************************************************************/
/* 入栈                                                                     */
/************************************************************************/
void push(StackElemType a)
{
top++;
if(top < MAX)  {
arr[top] = a;
}   else   {
cout<<"STACK FULL!!"<<top;
}
}
/************************************************************************/
/* 出栈                                                                     */
/************************************************************************/
StackElemType pop()
{
if(isEmpty())   {
cout<<"STACK IS EMPTY ";
return NULL;
} else {
StackElemType data=arr[top];
arr[top] = NULL;
top--;
return data;
}
}

/************************************************************************/
/* 出栈                                                                     */
/************************************************************************/
StackElemType getTop()
{
if(isEmpty())   {
cout<<"STACK IS EMPTY ";
return NULL;
} else {
return arr[top];
}
}
/************************************************************************/
/* 是否为空                                                                     */
/************************************************************************/
bool isEmpty()
{
if(top == -1) return true;
else return false;
}
};

class queue {
private:
QueueElemType   elem[MAX_QUEUE] ;     ///假设当数组只剩下一个单元时认为队满
int front;      //队头指针
int rear;       //队尾指针
public:
/************************************************************************/
/*
初始化
直接使用结构体指针变量,必须先分配内存地址,即地址的指针
*/
/************************************************************************/
void InitQueue()
{
front = rear = -1;

}
/************************************************************************/
/*     入队
*/
/************************************************************************/

void EnQueue(QueueElemType e)
{
if((rear+1)% MAX_QUEUE == front) exit(OVERFLOW);
rear = (rear + 1)% MAX_QUEUE;
elem[rear] = e;
}
/************************************************************************/
/*     出队
*/
/************************************************************************/
QueueElemType DeQueue()
{
if (QueueEmpty())  exit(QUEUEEMPTY);
front =  (front+1) % MAX_QUEUE;
return elem[front];
}
/************************************************************************/
/*    获取队头元素内容
*/
/************************************************************************/

QueueElemType GetFront()
{
if ( QueueEmpty() )  exit(QUEUEEMPTY);
return elem[ (front+1) % MAX_QUEUE ];
}
/************************************************************************/
/*    判断队列Q是否为空
*/
/************************************************************************/
int QueueEmpty()
{
if( front==rear) return TRUE;
else return FALSE;
}

};


二叉树遍历



/ Test.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"

/************************************************************************/
/* 算法:
*/
/************************************************************************/

Status CreateBiTree(BiTree &T);
Status PreOrderTraverse(BiTree &T) ;
Status visit(BiTree &T);

/************************************************************************/
/* 先序生成二叉树:
由于使用递归,要想退出函数,输入#的个数跟树的深度有关系
*/
/************************************************************************/
Status CreateBiTree(BiTree &T) {

char data ;
//scanf("%d", &data);
cin>> data;
if ( '#' == data )  T = NULL; //空格没法读入,所以使用#
else{
T = (BiTree) malloc(sizeof(BitNode));
if (!T) exit(OVERFLOW);
T->data =  data;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}

/************************************************************************/
/* 先序递归遍历二叉树:
*/
/************************************************************************/
Status PreOrderTraverse(BiTree &T) {
if(T) {
if(visit(T) )
if(PreOrderTraverse(T->lchild) )
if(PreOrderTraverse(T->lchild) ) return OK;
return ERROR;
}
return OK;
}
/************************************************************************/
/* 先序序循环遍历二叉树:
*/
/************************************************************************/
Status PreOrderTraverse_for(BiTree &T) {
BiTree root;
stack s;
s.inItStack();
root = T;
while(root || !s.isEmpty()) {
if(root) {
visit(root);
s.push(root);
root = root->lchild;
} else {
root = s.getTop();
s.pop();
root = root->rchild;
}
}
return OK;
}

/************************************************************************/
/*  层序遍历二叉树:
*/
/************************************************************************/

void LevelOrderTraverse(BiTree T)
{
BiTree root,TNode;
queue q;
root = T;
if(!root) exit(ERROR);
q.EnQueue(root);
while (!q.QueueEmpty())
{
TNode = q.DeQueue();
visit(TNode);
if (TNode->lchild) q.EnQueue(TNode->lchild);
if (TNode->rchild) q.EnQueue(TNode->rchild);

}
}

Status visit(BiTree &T){
if(T->visited != TRUE) {
T->visited = TRUE;
cout<<T->data;
return TRUE;
}
return FALSE;
}

void main(){
int pos =1 ;
BiTree T;
cout<<"- + a * b - c d / e f\n";
CreateBiTree( T);
//PreOrderTraverse(T);
//PreOrderTraverse_for(T);
LevelOrderTraverse(T);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: