二叉树的创建和遍历
如图所示的二叉树,我们用C++来实现其创建和三种遍历(前序、中序、后序)。
对于这样一个二叉树,我们按照前序输入应该是s = “ABD###CE##F##”,相当于D也有两个儿子,只不过为空而已。(#表示空)
创建的程序如下:
#include<iostream>
using namespace std;
#include<string.h>
struct BiNode
{
char data;
BiNode *lchild, *rchild;
};
class BiTree
{
private:
BiNode * root;
BiNode *create(string &s, int &pos);
void pre_traverse(BiNode * t);
void in_traverse(BiNode * t);
void post_traverse(BiNode * t);
public:
BiTree() { root = NULL; }
void create(string s);
void preTree();
void inTree();
void postTree();
};
//前序遍历的方式来创建二叉树
void BiTree::create(string s)
{
int pos = -1;
root = create(s, pos);
}
BiNode * BiTree::create(string &s, int &pos) //要用 引用 的方式
{
pos++;
BiNode * t;
if (pos >= s.size())
return NULL;
else
{
if (s[pos] == '#')
t = NULL;
else
{
t = new BiNode;
t->data = s[pos];
t->lchild = create(s, pos);
t->rchild = create(s, pos);
}
}
return t;
}
//前序遍历,遍历方式都是递归
void BiTree::preTree()
{
pre_traverse(root);
cout << endl;
}
void BiTree::pre_traverse(BiNode * t)
{
if(t != NULL)
{
cout << t->data << ' ';
pre_traverse(t->lchild);
pre_traverse(t->rchild);
}
}
// 中序遍历,递归
void BiTree::inTree()
{
in_traverse(root);
cout << endl;
}
void BiTree::in_traverse(BiNode *t)
{
if (t != NULL)
{
in_traverse(t->lchild);
cout << t->data << ' ';
in_traverse(t->rchild);
}
}
// 后序遍历,递归
void BiTree::postTree()
{
post_traverse(root);
cout << endl;
}
void BiTree::post_traverse(BiNode *t)
{
if (t != NULL)
{
post_traverse(t->lchild);
post_traverse(t->rchild);
cout << t->data << ' ';
}
}
int main() {
BiTree a;
string s = "ABD###CE##F##";
a.create(s);
cout << "前序遍历:" << endl;
a.preTree();
cout << "中序遍历:" << endl;
a.inTree();
cout << "后序遍历:" << endl;
a.postTree();
system("pause");
return 0;
}