二叉树的遍历(前序,中序,后序)

/*
*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()的前面定义!!!

             同理。。。。。。。。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值