首页 > 代码库 > 二叉树的基本操作——遍历

二叉树的基本操作——遍历

最近在看数据结构 看到树这一部分。二叉树是树的最重要的一部分,而二叉树的遍历又是对二叉树进行操作最基本的部分。小弟有些懒,懒得敲代码,导致学了这么久,也没真正自己写过二叉树的遍历部分。今天不过来,大部分代码都是参考别人的。留给自己以后看

#include <iostream>
#include <stack>
#include<queue>
using namespace std;


typedef char Elemtype;
typedef struct BiNode{
Elemtype data;
BiNode* lchild;
BiNode* rchild;
}BiTnode,*BiTree;

int CreatBiTree(BiTree& T)
{
char data;
cin>>data;
if (data =http://www.mamicode.com/= ‘#‘)
T = NULL;
else
{
T = new BiTnode;
T->data = http://www.mamicode.com/data;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return 0;
}

inline void visit(BiTree T)
{
if (T->data != ‘#‘)
cout << T->data;
}
////递归算法进行遍历
void PreOrderTraversr(BiTree T)
{
if (T != NULL)
{
visit(T);
PreOrderTraversr(T->lchild);
PreOrderTraversr(T->rchild);
}
}

void InOrderTraversr(BiTree T)
{
if (T != NULL)
{
InOrderTraversr(T->lchild);
visit(T);
InOrderTraversr(T->rchild);
}
}

void PosOrderTraversr(BiTree T)
{
if (T != NULL)
{
PosOrderTraversr(T->lchild);
PosOrderTraversr(T->rchild);
visit(T);
}
}
/////非递归遍历
void PreOrder2(BiTree T)
{
stack<BiTree> stackBi;
BiTree p = T;
while (p || !stackBi.empty())
{
if (p)
{
visit(p);
stackBi.push(p);
p = p->lchild;
}
else
{
p = stackBi.top();
stackBi.pop();
p = p->rchild;
}
}
}

void InOrder2(BiTree T)
{
stack<BiTree> stackBi;
BiTree p = T;
while(p || !stackBi.empty())
{
if (p)
{
stackBi.push(p);
p = p->lchild;
}
else
{
p = stackBi.top();
visit(p);
stackBi.pop();
p = p->rchild;
}
}

}

//非递归后序遍历二叉树
typedef struct BiTNodePost{
BiTree biTree;
char tag;
}BiTNodePost,*BiTreePost;

void PosOrder2(BiTree T)
{
stack<BiTreePost> stackBi;
BiTree p = T;
BiTreePost BT;
while(p || !stackBi.empty())
{
while(p)
{
BT = new BiTNodePost;
BT->biTree = p;
BT->tag = ‘L‘;
stackBi.push(BT);
p = p->lchild;
}
while (!stackBi.empty() && (stackBi.top())->tag ==‘R‘)
{
BT = stackBi.top();
//退栈
stackBi.pop();
visit(BT->biTree);
}
if (!stackBi.empty())
{
BT = stackBi.top();
BT->tag = ‘R‘;
p = BT->biTree;
p = p->rchild;
}

}

}
////层次遍历二叉树
void LevelOrder(BiTree T)
{
BiTree p = T;
queue<BiTree> queBi;
if (p)
queBi.push(p);
while (!queBi.empty())
{
BiTree q = queBi.front();
visit(q);
queBi.pop();
if (q->lchild)
queBi.push(q->lchild);
if (q->rchild)
queBi.push(q->rchild);
}
}

int main()
{
BiTree T;
CreatBiTree(T);
cout<<"递归先序遍历:";
PreOrderTraversr(T);
cout<<"递归中序遍历:";
InOrderTraversr(T);
cout<<"递归后序遍历";
PosOrderTraversr(T);
cout<<endl;

cout<<"非递归先序遍历:";
PreOrder2(T);
cout<<"非递归中序遍历:";
InOrder2(T);
cout<<"非递归后序遍历";
PosOrder2(T);
cout <<endl;
cout<<"层次遍历:";
LevelOrder(T);


return 0;
}

二叉树的基本操作——遍历