#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 100 //初始分配单元为100
//-------------------stack.h的定义----------------------------------------
//树的结点定义
typedef int DataType_tree; //树结点的数据域类型
typedef struct nodetree{
DataType_tree data;
struct nodetree *lchild;
struct nodetree *rchild;
}*BiTree,BiTNode;
//--------------------------------------------------------------
typedef BiTree DataType; //栈结点的数据域的类型为树结点的指针类型
typedef struct node //栈的表示
{
DataType *base; //栈底指针始终指向栈底的位置
//在栈构造之前和销毁之后,base的值为NULL
DataType *top; //栈顶指针
int stacksize; //当前已分配的存储空间,以元素为单位
}SqStack,Stack;
void InitStack(SqStack *st) //初始化栈
{
st->base=(DataType*)malloc(MAXSIZE*sizeof(DataType));
if(!st->base) return; //存储分配失败
st->top=st->base; //设置栈为空
st->stacksize=MAXSIZE;
}
int IsEmpty(SqStack st){ //判断栈是否为空
if(st.top==st.base)
return 1;
else
return 0;
}
void GetStack(SqStack st,DataType *dataElem){ //获取栈顶元素
if(st.top==st.base){
printf("错误,栈空");
return ;
}
*dataElem=*(st.top-1); //获取栈顶的值返回给参数指针指向的值
}
void PopStack(SqStack *st){ //出栈
if(st->top==st->base){
printf("栈空不能出栈");
return ;
}
st->top=--(st->top); //删除栈顶元素
}
void PushStack(SqStack *st,DataType dataElem){ //进栈
if(st->top-st->base>=st->stacksize){ //栈满不能进栈
printf("栈空不能出栈");
return ;
}
*st->top=dataElem;
st->top++;
}
///----------------------stack.h的定义结束-----------------------------------------
//------------------------树的操作定义------------------------------
void ProTree(BiTree root){
//前序遍历树递归算法
if(root!=NULL){
printf("%5d",root->data);
ProTree(root->lchild);
ProTree(root->rchild);
}
}
void Inorder(BiTree root){
//非递归算法的中序遍历
BiTNode *p;
SqStack s;
InitStack(&s);
p=root;
do
{
while(p!=NULL){ //若根节点不为空则进栈
PushStack(&s,p); //p指向左孩子直到为空
p=p->lchild;
}
if(!IsEmpty(s)){
GetStack(s,&p);
PopStack(&s); //出栈,打印该结点
printf("%5d",p->data);
p=p->rchild; //访问右孩子结点
}
}while(p!=NULL||!IsEmpty(s)); //若p不为空或栈不为空则继续循环
}
BiTree CreatTree(){
//用前序递归算法创建树
BiTNode *p;
DataType_tree input_x;
scanf("%d",&input_x);
if(input_x==0) p=NULL;
else{
p=(struct nodetree *)malloc(sizeof(BiTNode));
p->data=input_x;
p->lchild=CreatTree();
p->rchild=CreatTree();
}
return p;
}
int Tree_size(BiTree root){ //二叉树中的所有结点个数
if(root==NULL)return 0;
return 1+Tree_size(root->lchild)+Tree_size(root->lchild);
}
int Leaves_size(BiTree root){ //二叉树的叶节点个数
if(root==NULL)return 0;
if(root->rchild==NULL&& root->lchild) return 1;
return Leaves_size(root->lchild)+Leaves_size(root->rchild);
}
int Tree_Height(BiTree t){ //二叉树的高度,
int hl,hr;
if(t==NULL)return 0;
hl=Tree_Height(t->lchild);
hr=Tree_Height(t->rchild);
if(hl>hr) return hl+1;
else
return hr+1;
}
int TreeNode_Level(BiTNode *t,BiTNode *p ,int d){ //返回二叉树指定结点p在以*t为根的子树的层次
int levell;
if(t==NULL) return 0;
if(t==p)return (d);
if((levell=TreeNode_Level(t->lchild,p,d+1))>0)
return levell;
else
return TreeNode_Level(t->rchild,p,d+1);
}
void Tree_reflect(BiTNode *t){ //交换以*t为根的二叉树中每个结点的2个子女
BiTNode *p;
if(t==NULL)return ;
Tree_reflect(t->lchild);
Tree_reflect(t->rchild);
p=t->lchild;t->lchild=t->rchild;
t->rchild=p;
}
void Tree_Defoliate(BiTNode *&t){ //从以*t为根的二叉树中删去所有的结点
if(t==NULL) return ;
if(t->rchild==NULL && t->lchild==NULL){
free(t);t=NULL;
}
else{
Tree_Defoliate(t->lchild);
Tree_Defoliate(t->rchild);
}
}
//--------------树的操作定义结束--------------------------------
void main(){
BiTree root;
printf("\n\t\t请输入正整数以0作为结束标志\n");
root=CreatTree();
printf("\n\t前序输出树的结点数据域\n");
Inorder(root);
printf("\n");
}