数据结构(C语言版)规范代码之树(1)

来源:互联网 发布:淘宝直播平台 编辑:程序博客网 时间:2024/05/16 10:12

//树的操作
//输入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;
}

原创粉丝点击