结点的构建
class BiTreeNode {
public:
char data;//存放数据,结点的数据域
BiTreeNode* LeftChild;//左子树指针,结点指针域
BiTreeNode* RightChild;//右子树指针,结点指针域
BiTreeNode() { LeftChild = NULL; RightChild = NULL; }
~BiTreeNode(){}
};
树的构建
//树构造
class BiTree {
private:
BiTreeNode* Root;//根节点指针
string strTree;//字符串
int pos;
BiTreeNode* CreateBiTree();//构造二叉树(先序遍历法)
void PreOrder(BiTreeNode* t);//先序遍历
void InOrder(BiTreeNode* t);//中序遍历
void PostOrder(BiTreeNode* t);//后序遍历
public:
void CreateTree(string TreeArray);//构造二叉树接口
void PreOrder();//先序遍历接口
void InOrder();//中序遍历接口
void PostOrder();//后序遍历接口
};
利用先序遍历法构造二叉树
//利用先序遍历法构造二叉树
void BiTree::CreateTree(string TreeArray) {//共有函数,对外接口
pos = 0;
strTree.assign(TreeArray);//字符串复制
Root = CreateBiTree();
}
BiTreeNode* BiTree::CreateBiTree() {//递归建树,私有函数,类内实现
BiTreeNode* T;
char ch;
ch = strTree[pos++];//取字符串pos的位置元素,先赋值后加加
if (ch == '0') {
T = NULL;
}
else {
T = new BiTreeNode();//构造新结点
T->data = ch;//数据域赋值
T->LeftChild = CreateBiTree();//指针域成为新的结点继续构造二叉树
//左结点先构建完再构建右结点,为先序遍历法
T->RightChild = CreateBiTree();//指针域成为新的结点继续构造二叉树
}
return T;
}
先序遍历法
//先序遍历
void BiTree::PreOrder() {
PreOrder(Root);
}
void BiTree::PreOrder(BiTreeNode* t) {
if (t) {
cout << t->data;
PreOrder(t->LeftChild);
PreOrder(t->RightChild);
}
}
中序遍历法
//中序遍历
void BiTree::InOrder() {
InOrder(Root);
}
void BiTree::InOrder(BiTreeNode* t) {
if (t) {
InOrder(t->LeftChild);
cout << t->data;
InOrder(t->RightChild);
}
}
后序遍历法
//后序遍历
void BiTree::PostOrder() {
PostOrder(Root);
}
void BiTree::PostOrder(BiTreeNode* t) {
if (t) {
PostOrder(t->LeftChild);
cout << t->data;
PostOrder(t->RightChild);
}
}
层次遍历法
从上到下,从左到右进行遍历输出
利用队列先进先出的性质:先把根节点放入队列中,