1.二叉树的先序遍历:
若二叉树为空,则空操作;否则
(1)访问根节点;
(2)先序遍历左子树;
(3)先序遍历右子树;
2.二叉树的中序遍历:
若二叉树为空,则空操作;否则
(1)中序遍历左子树;
(2)访问根节点;
(3)中序遍历右子树;
3.二叉树的后序遍历:
若二叉树为空,则空操作;否则
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根节点;
如上图:
该二叉树的先序序列:
A B C D E G F
中序序列:
C B E G D F A
后序序列:
C G E F D B A
一下代码包括的内容有:
1.先序创建二叉树
2.递归实现二叉树的先序遍历,中序遍历,后序遍历。
3.非递归实现二叉树的三种遍历(详细参考http://blog.youkuaiyun.com/kofsky/article/details/2886453)
//BinaryTree.cpp
#ifndef BINARYTREE_H
#define BINARYTREE_H
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define OVERFLOW -2
#define Status bool
#define TRUE 1
#define FALSE 0
#define ERROR 0
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
bool flag; //设置标志位非递归实现后序遍历有用
struct BiTNode* lchild, *rchild;
}BiTNode, *BiTree;
Status PreCreateBiTree(BiTree &T); //按先序序列创建二叉树
Status PreOrderTraverse(BiTree T, Status (* visit)(TElemType e));
Status InOrderTraverse(BiTree T, Status (* visit)(TElemType e));
Status PostOrderTraverse(BiTree T, Status (* visit)(TElemType e));
Status LevelOrderTraverse(BiTree T, Status (* visit)(TElemType e));
//以非递归的方式中序遍历二叉树
Status InOrderTraverse2(BiTree T, Status (* visit)(TElemType e));
//以非递归的方式先序遍历二叉树
Status PreOrderTraverse2(BiTree T, Status (* visit)(TElemType e));
//以非递归的方式后续遍历二叉树
Status PostOrderTraverse2(BiTree T, Status (*visit)(TElemType e));
#endif
//BinaryTree.cpp
#include "BinaryTree.h"
#include "C:\Users\jinchunpeng\Desktop\数据结构\Stack\Stack\Stack.h" //见以前的博文
#include <stdio.h>
#include <stdlib.h>
Status PreCreateBiTree(BiTree &T)
{
char ch;
scanf("%c", &ch);
if (ch == ' ') T = NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = ch;
PreCreateBiTree(T->lchild);
PreCreateBiTree(T->rchild);
}
return OK;
}
Status PreOrderTraverse(BiTree T, Status (* visit)(TElemType e))
{
if (T)
{
visit(T->data);
PreOrderTraverse(T->lchild, visit);
PreOrderTraverse(T->rchild, visit);
}
return OK;
}
Status PostOrderTraverse(BiTree T, Status (* visit)(TElemType e))
{
if (T)
{
PostOrderTraverse(T->lchild, visit);
PostOrderTraverse(T->rchild, visit);
visit(T->data);
}
return OK;
}
Status InOrderTraverse(BiTree T, Status (* visit)(TElemType e))
{
if (T)
{
InOrderTraverse(T->lchild, visit);
visit(T->data);
InOrderTraverse(T->rchild, visit);
}
return OK;
}
Status InOrderTraverse2(BiTree T, Status (* visit)(TElemType e))
{
SqStack<BiTree> S;
S.InitStack();
BiTree p = T;
while (p || !S.StackEmpty())
{
if (!p)
{
S.Push(p);
p = p->lchild;
}
else
{
S.Pop(p);
if ( !visit(p->data) ) return ERROR;
p = p->rchild;
}
}
return OK;
}
Status PreOrderTraverse2(BiTree T, Status (* visit)(TElemType e))
{
SqStack<BiTree> S;
S.InitStack();
BiTree p = T;
while (p || !S.StackEmpty())
{
if (!p)
{
visit(p->data);
S.Push(p);
p = p->lchild;
}
else
{
S.Pop(p);
p = p->rchild;
}
}
return OK;
}
Status PostOrderTraverse2(BiTree T, Status (* visit)(TElemType e))
{
BiTree p = T;
p->flag = FALSE;
SqStack<BiTree> S;
S.InitStack();
if (p)
{
S.Push(p);
}
while (!S.StackEmpty())
{
S.Pop(p);
if (p->flag)
{
visit(p->data);
}
else
{
S.Push(p);
p->flag = TRUE;
if (p->rchild)
{
p->rchild->flag = FALSE;
S.Push(p->rchild);
}
if (p->lchild)
{
p->lchild->flag = FALSE;
S.Push(p->lchild);
}
}
}
return OK;
}
运行结果:
