【数据结构】之一、二叉树创建,前中后序遍历
2013-08-02 15:45
225 查看
代码积累日志!
http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91 这里都有介绍二叉树的基本概念!
下面看二叉树数据结构:
#define Type char
typedef struct BiTNode{
Type data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct{
BiTree data;
bool is;
}PostNode;
下面看二叉树基本操作:
BiTree CreateTree()
{
BiTree T = NULL;
Type e;
cout << "请输入数据(#结束):";
cin >> e;
if(e != '#')
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = e;
T->lchild = CreateTree();
T->rchild = CreateTree();
}
else
return NULL;
return T;
}
void MakeEmpty(BiTree &T)
{
if(T)
{
if(T->lchild)
MakeEmpty(T->lchild);
if(T->rchild)
MakeEmpty(T->rchild);
free(T);
T = NULL;
}
}
void Find(BiTree T, Type e)
{
if(T->data == e)
{
cout << "yes" << endl;
return ;
}
else
{
if(T->lchild)
Find(T, e);
if(T->rchild)
Find(T, e);
}
cout << "no" << endl;
}
下面看前序遍历的递归和非递归操作:
非递归操作需要用到stack结构。
void PreOrderTraverse(BiTree T)
{
if(!T)
return ;
cout << T->data << endl;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void PreOrderTraverse2(BiTree T)
{
stack<BiTNode*> s;
BiTree q = T;
while(q != NULL || !s.empty())
{
while(q != NULL)
{
cout << q->data << endl;
s.push(q);
q = q->lchild;
}
if(!s.empty())
{
q = s.top();
s.pop();
q = q->rchild;
}
}
}
下面看中序遍历的递归和非递归操作:
非递归需要stack结构。
void InOrderTraverse(BiTree T)
{
if(T == NULL)
return ;
InOrderTraverse(T->lchild);
cout << T->data << endl;
InOrderTraverse(T->rchild);
}
void InOrderTraverse2(BiTree T)
{
stack<BiTNode*> s;
BiTree q = T;
while(q != NULL || !s.empty())
{
while(q != NULL)
{
s.push(q);
q = q->lchild;
}
if(!s.empty())
{
q = s.top();
cout << q->data << endl;
s.pop();
q = q->rchild;
}
}
}
下面看后序遍历的递归非递归:
非递归也用到stack,这里较麻烦。
void PostOrderTraverse(BiTree T)
{
if(T == NULL)
return ;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data << endl;
}
void PostOrderTraverse2(BiTree T)
{
stack<PostNode*> s;
PostNode* postq;
BiTree q = T;
while(q != NULL || !s.empty())
{
while(q != NULL)
{
PostNode *postq = (PostNode*)malloc(sizeof(PostNode));
postq->data = q;
postq->is = true;
s.push(postq);
q = q->lchild;
}
if(!s.empty())
{
postq = s.top();
s.pop();
if(postq->is == true)
{
postq->is = false;
s.push(postq);
q = postq->data->rchild;
}
else
{
cout << postq->data->data << endl;
q = NULL;
}
}
}
}
下面看层序遍历:
此处需要用到队列deque。
void LayerOrderTraverse(BiTree T)
{
deque<BiTree> q;
BiTree p;
if(T)
{
q.push_back(T);
}
else
return;
while(!q.empty())
{
p = q.front();
q.pop_front();
cout << p->data << endl;
if(p->lchild)
{
q.push_back(p->lchild);
}
if(p->rchild)
{
q.push_back(p->rchild);
}
}
}
2013.8.2
jofranks 于南昌
http://zh.wikipedia.org/wiki/%E4%BA%8C%E5%8F%89%E6%A0%91 这里都有介绍二叉树的基本概念!
下面看二叉树数据结构:
#define Type char
typedef struct BiTNode{
Type data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;
typedef struct{
BiTree data;
bool is;
}PostNode;
下面看二叉树基本操作:
BiTree CreateTree()
{
BiTree T = NULL;
Type e;
cout << "请输入数据(#结束):";
cin >> e;
if(e != '#')
{
T = (BiTree)malloc(sizeof(BiTNode));
T->data = e;
T->lchild = CreateTree();
T->rchild = CreateTree();
}
else
return NULL;
return T;
}
void MakeEmpty(BiTree &T)
{
if(T)
{
if(T->lchild)
MakeEmpty(T->lchild);
if(T->rchild)
MakeEmpty(T->rchild);
free(T);
T = NULL;
}
}
void Find(BiTree T, Type e)
{
if(T->data == e)
{
cout << "yes" << endl;
return ;
}
else
{
if(T->lchild)
Find(T, e);
if(T->rchild)
Find(T, e);
}
cout << "no" << endl;
}
下面看前序遍历的递归和非递归操作:
非递归操作需要用到stack结构。
void PreOrderTraverse(BiTree T)
{
if(!T)
return ;
cout << T->data << endl;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
void PreOrderTraverse2(BiTree T)
{
stack<BiTNode*> s;
BiTree q = T;
while(q != NULL || !s.empty())
{
while(q != NULL)
{
cout << q->data << endl;
s.push(q);
q = q->lchild;
}
if(!s.empty())
{
q = s.top();
s.pop();
q = q->rchild;
}
}
}
下面看中序遍历的递归和非递归操作:
非递归需要stack结构。
void InOrderTraverse(BiTree T)
{
if(T == NULL)
return ;
InOrderTraverse(T->lchild);
cout << T->data << endl;
InOrderTraverse(T->rchild);
}
void InOrderTraverse2(BiTree T)
{
stack<BiTNode*> s;
BiTree q = T;
while(q != NULL || !s.empty())
{
while(q != NULL)
{
s.push(q);
q = q->lchild;
}
if(!s.empty())
{
q = s.top();
cout << q->data << endl;
s.pop();
q = q->rchild;
}
}
}
下面看后序遍历的递归非递归:
非递归也用到stack,这里较麻烦。
void PostOrderTraverse(BiTree T)
{
if(T == NULL)
return ;
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout << T->data << endl;
}
void PostOrderTraverse2(BiTree T)
{
stack<PostNode*> s;
PostNode* postq;
BiTree q = T;
while(q != NULL || !s.empty())
{
while(q != NULL)
{
PostNode *postq = (PostNode*)malloc(sizeof(PostNode));
postq->data = q;
postq->is = true;
s.push(postq);
q = q->lchild;
}
if(!s.empty())
{
postq = s.top();
s.pop();
if(postq->is == true)
{
postq->is = false;
s.push(postq);
q = postq->data->rchild;
}
else
{
cout << postq->data->data << endl;
q = NULL;
}
}
}
}
下面看层序遍历:
此处需要用到队列deque。
void LayerOrderTraverse(BiTree T)
{
deque<BiTree> q;
BiTree p;
if(T)
{
q.push_back(T);
}
else
return;
while(!q.empty())
{
p = q.front();
q.pop_front();
cout << p->data << endl;
if(p->lchild)
{
q.push_back(p->lchild);
}
if(p->rchild)
{
q.push_back(p->rchild);
}
}
}
2013.8.2
jofranks 于南昌
相关文章推荐
- 数据结构练习(39)二叉树前中后序遍历的非递归实现
- 【数据结构】二叉树前中后序遍历、层序遍历(递归实现)
- 数据结构---二叉树的创建、先序、中序、后序遍历
- 数据结构 第13讲 三元组 (F、C、L/R) 序列创建二叉树
- 数据结构 学习笔记(四):树(上):树的表示,二分查找,二叉树,先中后层次遍历
- 数据结构---二叉树的创建和遍历
- 【数据结构】二叉树的递归与非递归创建和遍历
- 二叉树的前中后序遍历
- C++实现对树的创建和前中后序遍历
- 【数据结构_树_Tree_0971】统计利用先序遍历创建的二叉树的深度
- 144-94-145 二叉树的前中后序遍历
- 二叉树的简单操作(前中后序遍历,层次遍历,树高,叶子数,交换二叉树等)
- 数据结构和算法--二叉树创建和递归遍历
- 数据结构 — 二叉树(创建、遍历)java实现
- 剑指offer-面试6:重建二叉树(二叉树前中后序遍历)
- 二叉树的前序建立,前中后序遍历的非递归算法
- 数据结构与算法之——二叉树的创建及遍历
- 二叉树的递归与非递归算法(前中后序遍历,C++实现)
- Java源码集合类TreeMap学习1——数据结构3二叉树创建代码
- 数据结构之二叉树的递归创建、递归遍历