//树的操作
//输入ABC##E##DFY###G##
#include<iostream>
#include<malloc.h>
using namespace std;
#define Status int
#define TElemType char
#define SElemType BiTree
#define OVERFLOW 0
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef struct BiTNode//树结点
{
TElemType data;//数据域
struct BiTNode *lchild,*rchild;//指针域
}BiTNode,*BiTree;
typedef struct
{
SElemType *base;//在栈构造之前和销毁之后,base的值为NULL
SElemType *top;//栈顶指针
int stacksize;//当前已经分配的存储空间,以元素为单位
}SqStack;
Status Visit(BiTree e);//访问函数
Status CreateBiTree(BiTree &T);//产生一个树
//遍历方法若干
Status RecursionPreOrderTraverse(BiTree T);//递归算法先序遍历
Status RecursionInOrderTraverse(BiTree T);//递归算法中序遍历
Status RecursionPostOrderTraverse(BiTree T);//递归算法后序遍历
Status InOrderTraverse(BiTree T ,Status (*)(BiTree));//非递归中序遍历
Status InitStack(SqStack &S);//初始化一个栈
Status StackEmpty(SqStack &S);//判断栈是否为空
Status Push(SqStack &S,SElemType e);//入栈
Status Pop(SqStack &S,SElemType &e);//出栈
Status SeekDChildren(BiTree e);//寻找D孩子
Status SeekLeaf(BiTree e);//寻找叶子
BiTree SeekElem(BiTree T,TElemType e);//返回某个指定元素的地址
void main()
{
cout<<"先序建树:";
BiTree T=NULL;
CreateBiTree(T);
cout<<"\n中序遍历:";
InOrderTraverse(T,Visit);//输出B
cout<<"\nD的左右孩子节点分别是:";
InOrderTraverse(T,SeekDChildren);//找到D输出孩子
cout<<endl;
cout<<"B的所有叶子节点为:";
InOrderTraverse(SeekElem(T,'B'),SeekLeaf);//输出B的所有叶子节点
}
Status Visit(BiTree e)//访问函数主要是输出功能
{
cout<<e->data;
return OK;
}
Status SeekDChildren(BiTree e)//找到D的孩子节点
{
if(e->data=='D')
cout<<e->lchild->data<<e->rchild->data;
return OK;
}
Status SeekLeaf(BiTree e)//寻找叶子
{
if(e->lchild==NULL&&e->rchild==NULL)
cout<<e->data;
return OK;
}
BiTree SeekElem(BiTree T,TElemType e)//返回某个指定元素的地址
{
SqStack S;
InitStack(S);
BiTree p=T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
Pop(S,p);
if(p->data==e)
return p;
p=p->rchild;
}
}
return NULL;
}
Status CreateBiTree(BiTree &T)
{
//构造二叉链表表示的二叉树T
char ch;
cin>>ch;
if(ch=='#')
{
T=NULL;
}
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK;
}
Status RecursionPreOrderTraverse(BiTree T)
{
// 递归先序遍历二叉树T
if (T) {
cout<<T->data;
RecursionPreOrderTraverse(T->lchild);
RecursionPreOrderTraverse(T->rchild);
}
return OK;
}
Status RecursionInOrderTraverse(BiTree T)
{
// 递归中序遍历二叉树T
if (T) {
RecursionInOrderTraverse(T->lchild);
cout<<T->data;
RecursionInOrderTraverse(T->rchild);
}
return OK;
}
Status RecursionPostOrderTraverse(BiTree T)
{
// 递归后序遍历二叉树T
if (T) {
RecursionPostOrderTraverse(T->lchild);
RecursionPostOrderTraverse(T->rchild);
cout<<T->data;
}
return OK;
}
Status InOrderTraverse(BiTree T ,Status (*Visit)(BiTree))
{
//中序遍历二叉树T非递归算法
SqStack S;
InitStack(S);
BiTree p=T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
Pop(S,p);
if(!Visit(p))
return ERROR;
p=p->rchild;
}
}
return OK;
}
Status FInOrderTraverse(BiTree T)
{
//中序遍历二叉树T非递归算法
SqStack S;
InitStack(S);
BiTree p=T;
while(p||!StackEmpty(S))
{
if(p)
{
Push(S,p);
p=p->lchild;
}
else
{
Pop(S,p);
if(!printf("%c",p->data))
return ERROR;
p=p->rchild;
}
}
return OK;
}
Status InitStack(SqStack &S)//初始化
{
//构造一个空的栈S
S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
Status StackEmpty(SqStack &S)//判断是否为空栈
{
if(S.top==S.base)
return OK;
return ERROR;
}
Status Push(SqStack &S,SElemType e)//压入
{
if(S.top-S.base>=S.stacksize)
{
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S.base) exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return OK;
}
Status Pop(SqStack &S,SElemType &e)//弹出
{
if(S.top==S.base) return ERROR;
e=*--S.top;
return OK;
}