您的位置:首页 > 理论基础 > 数据结构算法

【数据结构】之一、二叉树创建,前中后序遍历

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 于南昌
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: