码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-10-28 17:43:56      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:io   os   ar   sp   数据   on   代码   amp   ef   

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

#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 == ‘#‘)
T = NULL;
else
{
T = new BiTnode;
T->data = 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;
}

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

标签:io   os   ar   sp   数据   on   代码   amp   ef   

原文地址:http://www.cnblogs.com/niupan369/p/4057198.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!