二叉树的深度优先遍历
二叉树的深度优先遍历分为三种,先序遍历,中序遍历和后序遍历
1.先序遍历的操作过程:
若二叉树为空,那么为空操作,否则依次执行如下三个操作
- 访问根节点(data)
- 先序遍历左子树
- 先序遍历右子树
2.中序遍历的操作过程:
若二叉树为空,那么为空操作,否则依次执行如下三个操作
- 中序遍历左子树
- 访问根节点(data)
中序遍历右子树
3.先序遍历的操作过程:
若二叉树为空,那么为空操作,否则依次执行如下三个操作后序遍历左子树
- 后序遍历右子树
- 访问根节点(data)
二叉树的建立, 三种遍历的递归和非递归方式
#include <iostream>
#include <stack>
using namespace std;
typedef char datatype;
typedef struct Node
{
datatype data;
struct Node *lchild;
struct Node *rchild;
}*BiTree,Node;
void OutputData(datatype ch,int level)
{
cout << "第" << level << "层元素是" << ch << endl;
}
void OutputData(datatype ch)
{
cout << "遍历元素为" << ch << endl;
}
/*二叉树的建立*/
void CreateBiTree(BiTree *T)
{
/*这里的T是(BiTree *)类型的指针,故(*T)是BiTree类型的指针,lchild,rchild都是BiTree类型变量*/
/*BiTree *T 就相当于Node** T。*/
datatype ch;
cin >> ch;
if (ch == '#')
{
*T = NULL;
}
else
{
*T = (BiTree)malloc(sizeof(Node));
if (!*T)
exit(OVERFLOW);
else
{
(*T)->data = ch;
CreateBiTree(&(*T)->lchild);/*这里先对T解引用,然后指向自己的左结点,探后对自己的左结点取指针,传入CreateBiTree*/
CreateBiTree(&(*T)->rchild);
}
}
}
/*递归方式前序遍历二叉树*/
void PreOrderTraverse(BiTree T, int level)
{
if (T == NULL)
{
return;
}
else
{
OutputData(T->data,level);
PreOrderTraverse(T->lchild, level + 1);
PreOrderTraverse(T->rchild, level + 1);
}
}
/*递归方式中序遍历二叉树*/
void MidOrderTraverse(BiTree T, int level)
{
if (T == NULL)
{
return;
}
else
{
MidOrderTraverse(T->lchild, level + 1);
OutputData(T->data,level);
MidOrderTraverse(T->rchild, level + 1);
}
}
/*递归方式后序遍历二叉树*/
void NextOrderTraverse(BiTree T, int level)
{
if (T == NULL)
{
return;
}
else
{
MidOrderTraverse(T->lchild, level + 1);
MidOrderTraverse(T->rchild, level + 1);
OutputData(T->data, level);
}
}
/*非递归方式前序遍历二叉树*/
void PreOrderTraverse1(BiTree T)
{
stack<BiTree> s;
BiTree p = T;
while (p!=NULL ||!s.empty())//当p指针不为空,或者s不为空时继续循环
{
while (p != NULL)//p不为空时继续循环
{
OutputData(p->data);
s.push(p); //p入栈
p = p->lchild;//P指向他的左子树
}
if (!s.empty())
{
p = s.top();
s.pop();
p = p->rchild;
}
}
}
/*非递归方式中序遍历二叉树*/
void MidOrderTraverse1(BiTree T)
{
stack<BiTree> s;
BiTree p = T;
while (p != NULL || !s.empty())
{
while (p != NULL)
{
s.push(p);
p = p->lchild;
}
if (!s.empty())
{
p = s.top();
OutputData(p->data);
s.pop();
p = p->rchild;
}
}
}
/*非递归方式后序遍历二叉树*/
void NextOrderTraverse1(BiTree T)
{
/*与先序遍历和中序遍历不同的是,后序遍历需要添加一个lastvisit的一个指针用来记录已经访问过的最后一个值*/
stack<BiTree> s;
BiTree p = T;
BiTree lastvisit = T;
while (p != NULL || !s.empty())
{
while (p!=NULL)
{
s.push(p);
p = p->lchild;
}
p = s.top();
//如果右子树为空或者右子树被访问过,那么直接输出
if (p->rchild == NULL || p->rchild == lastvisit)
{
OutputData(p->data);
s.pop();
lastvisit = p;
p = NULL;
}
else
{
p = p->rchild;
}
}
}
int main()
{
int level = 1;
BiTree bitree=NULL;
CreateBiTree(&bitree);
cout << "递归前序遍历输出为:" << endl;
PreOrderTraverse(bitree, level);
cout << endl;
cout << "递归前序遍历输出为:" << endl;
PreOrderTraverse1(bitree);
cout << endl;
cout << "递归中序遍历输出为:" << endl;
MidOrderTraverse(bitree, level);
cout << endl;
cout << "非递归中序遍历输出为:" << endl;
MidOrderTraverse1(bitree);
cout << endl;
cout << "递归后序遍历输出为:" << endl;
NextOrderTraverse(bitree, level);
cout << endl;
cout << "非递归后序遍历输出为:" << endl;
NextOrderTraverse1(bitree);
cout << endl;
}