/*
*Copyright(c) 2011,烟台大学计算机学院学生
*All rights reserved.
*文件名称:二叉树的遍历(前序,中序,后序)
*作 者:Mr_chang
*完成日期: 2012年 12月15 日
*/
#include <iostream>
using namespace std;
struct Btnode
{ int d; //数据域
Btnode *lchild; //左指针域
Btnode *rchild; //右指针域
};
//二叉链表类
class Binary_Tree
{ private:
Btnode *BT; //二叉链表根结点指针
public: //成员函数
Binary_Tree() { BT=NULL; return; } //二叉链表初始化
void creat_Binary_Tree(int); //生成二叉链表
void pretrav_Binary_Tree(); //前序遍历二叉链表
void intrav_Binary_Tree(); //中序遍历二叉链表
void postrav_Binary_Tree(); //后序遍历二叉链表
};
static creat(Btnode *p, int k, int end)
{
Btnode *q;
int x;
cin >>x; //输入结点值
if (x!=end) //结点值为非结束符值
{ q=new Btnode; //申请一个二叉链表结点
q->d=x; q->lchild=NULL; q->rchild=NULL;
if (k==1) p->lchild=q; //链接到左子树
if (k==2) p->rchild=q; //链接到右子树
creat(q, 1, end); //输入左子结点值
creat(q, 2, end); //输入右子结点值
}
return 0;
}
//生成二叉链表
void Binary_Tree::creat_Binary_Tree(int end)
{ Btnode *p;
int x;
cin >>x; //输入第一个结点值
if (x==end) return; //第一个值为结束符值
p=new Btnode; //申请二叉链表根结点
p->d=x; p->lchild=NULL; p->rchild=NULL;
BT=p; //二叉树根结点
creat(p, 1, end); //输入左子结点值
creat(p, 2, end); //输入右子结点值
return;
}
static pretrav(Btnode *p)
{ if (p!=NULL)
{ cout <<p->d <<" "; //输出根结点值
pretrav(p->lchild); //前序遍历左子树
pretrav(p->rchild); //前序遍历右子树
}
return 0;
}
//前序遍历二叉链表
void Binary_Tree::pretrav_Binary_Tree()
{ Btnode *p;
p=BT;
pretrav(p); //从根结点开始前序遍历
cout <<endl;
return;
}
static intrav(Btnode *p)
{ if (p!=NULL)
{ intrav(p->lchild); //中序遍历左子树
cout <<p->d <<" "; //输出根结点值
intrav(p->rchild); //中序遍历右子树
}
return 0;
}
//中序遍历二叉链表
void Binary_Tree::intrav_Binary_Tree()
{ Btnode *p;
p=BT;
intrav(p); //从根结点开始中序遍历
cout <<endl;
return;
}
static postrav(Btnode *p)
{ if (p!=NULL)
{ postrav(p->lchild); //后序遍历左子树
postrav(p->rchild); //后序遍历右子树
cout <<p->d <<" "; //输出根结点值
}
return 0;
}
//后序遍历二叉链表
void Binary_Tree::postrav_Binary_Tree()
{ Btnode *p;
p=BT;
postrav(p); //从根结点开始后序遍历
cout <<endl;
return;
}
int main()
{ Binary_Tree b; //建立一个二叉树对象b,数据域为整型
cout <<"输入各结点值(-1为结束符值):" <<endl;
b.creat_Binary_Tree(-1); //从键盘输入二叉树各结点值,以-1作为结束值
cout <<"前序序列:" <<endl;
b.pretrav_Binary_Tree(); //前序遍历二叉树对象b
cout <<"中序序列:" <<endl;
b.intrav_Binary_Tree(); //中序遍历二叉树对象b
cout <<"后序序列:" <<endl;
b.postrav_Binary_Tree(); //后序遍历二叉树对象b
return 0;
}
总结:static creat(Btnode *p, int k, int end)应放到void Binary_Tree::creat_Binary_Tree(int end)的前面定义!!
static pretrav(Btnode *p)应放到void Binary_Tree::pretrav_Binary_Tree()的前面定义!!!
同理。。。。。。。。