转换二叉树与广义表(C语言版)[二叉树的定义]
//定义二叉树结点结构和操作的头文件btree1.h
//定义二叉树结点值的类型为字符型
typedef char ElemType;
//定义二叉树结点类型
struct BTreeNode {
ElemType data;
BTreeNode* left;
BTreeNode* right;
};
//初始化二叉树,即把树根指针置空
void InitBTree(BTreeNode*& BT);
//根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构
void CreateBTree(BTreeNode*& BT, char* a);
//判断二叉树是否为空
bool BTreeEmpty(BTreeNode* BT);
//按任一种遍历次序输出二叉树中的所有结点
void TraverseBTree(BTreeNode* BT, int mark);
//求二叉树的深度
int BTreeDepth(BTreeNode* BT);
//求二叉树中所有结点数
int BTreeCount(BTreeNode* BT);
//求二叉树中所有叶子结点数
int BTreeLeafCount(BTreeNode* BT);
//按照二叉树的一种表示方法输出整个二叉树
void PrintBTree(BTreeNode* BT);
//清除二叉树,使之变为一棵空树
void ClearBTree(BTreeNode*& BT);
//二叉树操作的实现文件btree1.cpp
#include<iostream.h>
#include<stdlib.h>
#include<strstrea.h>
//初始化二叉树,即把树根指针置空
void InitBTree(BTreeNode*& BT)
{
BT=NULL;
}
//根据存于字符数组a的二叉树广义表建立对应的二叉树存储结构
void CreateBTree(BTreeNode*& BT, char* a)
{
BTreeNode* s[10]; //s数组作为存储二叉树中根结点指针的栈
int top=-1; //top作为s栈的栈顶指针
BT=NULL; //给树根指针置空
BTreeNode* p; //定义p为指向二叉树结点的指针
int k; //用k作为处理结点的左子树和右子树的标记,k=1处理
//左子树,k=2处理右子树
istrstream ins(a); //把字符串a定义为输入字符串流对象ins
char ch;
ins>>ch; //从ins流对象顺序读入一个字符,
while (ch!='@')
{ //每循环一次处理一个读入的字符,直到扫描到'@'字符为止
switch(ch)
{
case '(':
top++; s[top]=p; k=1; break;
case ')':
top--; break;
case ',':
k=2; break;
default:
p=new BTreeNode;
p->data=ch; p->left=p->right=NULL;
if(BT==NULL) BT=p;
else {
if(k==1) s[top]->left=p;
else s[top]->right=p;
}
}
ins>>ch;
}
}
//判断二叉树是否为空
bool BTreeEmpty(BTreeNode* BT)
{
return BT==NULL;
}
//按任一种遍历次序输出二叉树中的所有结点
void TraverseBTree(BTreeNode* BT, int mark)
{
if(mark==1) { //先序遍历
if(BT!=NULL) {
cout<<BT->data<<' ';
TraverseBTree(BT->left,mark);
TraverseBTree(BT->right,mark);
}
}
else if(mark==2) { //中序遍历
if(BT!=NULL) {
TraverseBTree(BT->left,mark);
cout<<BT->data<<' ';
TraverseBTree(BT->right,mark);
}
}
else if(mark==3) { //后续遍历
if(BT!=NULL) {
TraverseBTree(BT->left,mark);
TraverseBTree(BT->right,mark);
cout<<BT->data<<' ';
}
}
else if(mark==4) //按层遍历
{
const MaxLength=30;
BTreeNode* Q[MaxLength];
//定义存储二叉树结点指针的数组空间作为队列使用
int front=0, rear=0;
//定义队首指针和队尾指针,初始均置0表示空队
BTreeNode* p;
if(BT!=NULL) {
rear=(rear+1)%MaxLength; //后移队尾指针
Q[rear]=BT; //将树根结点指针进队
}
while (front!=rear)
{ //当队列非空时执行循环
front=(front+1)%MaxLength;
//后移队首指针
p=Q[front];
//删除队首结点
cout<<p->data<<' ';
//输出队首结点的值
if(p->left!=NULL)
{ //若结点存在左孩子,则左孩子结点指针进队
rear=(rear+1)%MaxLength;
Q[rear]=p->left;
}
if(p->right!=NULL)
{ //若结点存在右孩子,则右孩子结点指针进队
rear=(rear+1)%MaxLength;
Q[rear]=p->right;
}
}
}
else {
cerr<<"mark的值无效! 遍历失败!"<<endl;
exit(1);
}
}
广义表转二叉树
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTree
{
char data;
struct BiTree *lchild;
struct BiTree *rchild;
}BitreeNode;
void CreateBiTree(BitreeNode ** BT)
{
char *s= new char[20];
char ch;
int top = -1,i=0,key;
BitreeNode *node[10],*p=0;
*BT = NULL;
printf("请输入树的广义表表达式,例如“A(B(D,E),C)@”:/n");
scanf("%s",s);
ch = s[i++];
while(ch !='@')
{
switch(ch)
{
case '(':node[++top] = p;key = 1;break;
case ')':top--;break;
case ',':key = 2;break;
default: p = new BitreeNode;
p->data = ch;
p->lchild = p->rchild = NULL;
if(*BT == NULL)
*BT = p;
else
{
switch(key)
{
case 1:
node[top]->lchild = p;
break;
case 2:
node[top]->rchild = p;
break;
}
}
}
ch = s[i++];
}
}
void main()
{
BitreeNode *Node;
CreateBiTree(&Node);
}