.h文件:
/*二叉树独立结点的链式存储*/
typedef char ElemType;
struct BTreeNode
{
ElemType data;
BTreeNode *left;
BTreeNode *right;
BTreeNode *parent;
};
//初始化二叉树
void InitBTree(BTreeNode* &BT)
{
BT = NULL;
}
//建立二叉树
void CreateBTree(BTreeNode* &BT, char *a)
{
BTreeNode *s[10];
int top = -1;
BT = NULL;
BTreeNode *p;
int k;
istrstream ins(a);
char ch;
ins>>ch;
while(ch != '@')
{
switch(ch)
{
case '(':
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 if(k == 2)
s[top]->right = p;
}
break;
}
ins>>ch;
}
}
//检查二叉树是否为空
int BTreeEmpty(BTreeNode* &BT)
{
return (BT == NULL);
}
/*遍历二叉树*/
//前序遍历
void PreOrder(BTreeNode* BT)
{
if(BT != NULL)
{
cout<<BT->data<<" ";
PreOrder(BT->left);
PreOrder(BT->right);
}
}
//中序便利
void InOrder(BTreeNode* BT)
{
if(BT != NULL)
{
InOrder(BT->left);
cout<<BT->data<<" ";
InOrder(BT->right);
}
}
//后序遍历
void PostOrder(BTreeNode* BT)
{
if(BT != NULL)
{
PostOrder(BT->left);
PostOrder(BT->right);
cout<<BT->data<<" ";
}
}
//按层遍历(非递归)
void LevelOrder(BTreeNode *BT)
{
BTreeNode *q[30],*p;
int front = 0,rear = 0;
if(BT != NULL)
{
rear = (rear + 1) % 30;
q[rear] = BT;
}
while(front != rear)
{
front = (front + 1) % 10;
p = q[front];
cout<<p->data<<" ";
if(p->left != NULL)
{
rear = (rear + 1) % 10;
q[rear] = p->left;
}
if(p->right != NULL)
{
rear = (rear + 1) % 10;
q[rear] = p->right;
}
}
}
//求二叉树深度
int BTreeDepth(BTreeNode *BT)
{
if(BT == NULL)
return 0;
int dep_left = BTreeDepth(BT->left);
int dep_right = BTreeDepth(BT->right);
if(dep_left > dep_right)
return dep_left+1;
return dep_right+1;
}
//输出二叉树,可在前序遍历的基础上做适当修改
void PrintBTree(BTreeNode *BT)
{
if(BT != NULL)
{
cout<<BT->data;
if(BT->left != NULL || BT->right != NULL)
{
cout<<"(";
PrintBTree(BT->left);
if(BT->right != NULL)
cout<<",";
PrintBTree(BT->right);
cout<<")";
}
}
}
/*清除二叉树*/
//删除二叉树的所有结点
void DeleteBTree(BTreeNode *BT)
{
if(BT != NULL)
{
DeleteBTree(BT->left);
DeleteBTree(BT->right);
delete BT;
}
}
//清除一棵二叉树
void ClearBTree(BTreeNode* &BT)
{
DeleteBTree(BT);
BT = NULL;
}
.cpp文件:
#include <iostream>
#include <strstream>
using namespace std;
#include "BTree.h"
int main()
{
BTreeNode *bt;
InitBTree(bt);
char b[50];
cout<<"输入以'@'字符作为结束符的二叉树广义表表示:"<<endl;
cin.getline(b,sizeof(b));
CreateBTree(bt,b);
PrintBTree(bt);
cout<<endl<<"前序:";
PreOrder(bt);
cout<<endl<<"中序:";
InOrder(bt);
cout<<endl<<"后序:";
PostOrder(bt);
cout<<endl<<"按层:";
LevelOrder(bt);
cout<<endl<<"二叉树的深度为:";
cout<<BTreeDepth(bt)<<endl;
ClearBTree(bt);
return 0;
}
//输入 A(B(C,D),E(,F(G)))@