树的基本算法

#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");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值