typedef struct node
{
char data;
struct node * left;
struct node * right;
}Treepoint;
//二叉树结点的一种定义方式
建立二叉树,利用递归方式
这里存储的数据是char 型的数据,以‘#’结束。
Treepoint * creatTree()
{
char ch;
Treepoint * treenode;
cin>>ch;
if(ch == '#')
treenode = NULL;
else
{
treenode = (Treepoint *)malloc(sizeof(Treepoint));
treenode->data = ch;
treenode->left = creatTree();
treenode->right = creatTree();
}
return treenode;
}
先序遍历
先序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。
void forder(Treepoint * treenode)
{
if(treenode == NULL)
return ;
cout<<treenode->data;//这里根据需要加分隔符,也可不加
forder(treenode->left);
forder(treenode->right);
}
中序遍历
中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。
void morder(Treepoint * treenode)//中序遍历
{
if(treenode == NULL)
return ;
morder(treenode->left);
cout<<treenode->data;
morder(treenode->right);
}
后序遍历
后序遍历首先遍历左子树,然后遍历右子树,最后访问根结点,在遍历左、右子树时,仍然先遍历左子树,然后遍历右子树,最后遍历根结点。
void lorder(Treepoint * treenode)//后序遍历
{
if(treenode == NULL)
return ;
lorder(treenode->left);
lorder(treenode->right);
cout<<treenode->data;
}
层序遍历,类似于bfs,利用队列一层一层进行遍历
void LevelOrder(BinTree bt)//类似BFS
{
BinTree p;
queue<BinTree> q;
if(bt==NULL)
{
return;
}
p=bt;
q.push(bt);
while(!q.empty())
{
p=q.front();
q.pop();
cout<<p->data<<" ";
if(p->leftchild!=NULL)
{
q.push(p->leftchild);
}
if(p->rightchild!=NULL)
{
q.push(p->rightchild);
}
}
}
完整代码
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <queue>
using namespace std;
typedef struct node//树结点的定义
{
char data;
struct node * left;
struct node * right;
}Treepoint;
Treepoint * creatTree()//建立树
{
char ch;
Treepoint * treenode;
cin>>ch;
if(ch == '#')
treenode = NULL;
else
{
treenode = (Treepoint *)malloc(sizeof(Treepoint));
treenode->data = ch;
treenode->left = creatTree();
treenode->right = creatTree();
}
return treenode;
}
void forder(Treepoint * treenode)//先序遍历
{
if(treenode == NULL)
return ;
cout<<treenode->data;//这里根据需要加分隔符,也可不加
forder(treenode->left);
forder(treenode->right);
}
void morder(Treepoint * treenode)//中序遍历
{
if(treenode == NULL)
return ;
morder(treenode->left);
cout<<treenode->data;
morder(treenode->right);
}
void lorder(Treepoint * treenode)//后序遍历
{
if(treenode == NULL)
return ;
lorder(treenode->left);
lorder(treenode->right);
cout<<treenode->data;
}
void Lorder(Treepoint * treenode)//层序遍历
{
queue <Treepoint *> q;
Treepoint * p = treenode;
if(p == NULL)
return ;
q.push(p);
while(!q.empty())
{
p = q.front();
q.pop();
cout<<p->data;
if(p->left != NULL)
q.push(p->left);
if(p->right != NULL)
q.push(p->right);
}
}
int main()
{
Treepoint * root = creatTree();
forder(root);
cout<<endl;
morder(root);
cout<<endl;
lorder(root);
cout<<endl;
Lorder(root);
return 0;
}