#ifndef BINARY_TREE_H
#define BINARY_TREE_H
#include<iostream>
#define MAX 100
using namespace std;
typedef struct Bitree
{
int data;
struct Bitree *lchild,*rchild;
}Binode,*bitree;
typedef bitree QDataType;
typedef struct
{
QDataType data[MAX+1];
int front,rear;
}Queue;
//(1)初始化队列q
void InitQueue(Queue &q)
{
q.front=0;
q.rear=0;
}
//(2)判断队列q是否非空;
int EmptyQueue(Queue &q)
{
if(q.rear==q.front) return 1;
else return 0;
}
//(3)依次进队元素a,b,c
void InsqQueue(Queue &q,QDataType x)
{
if(q.rear==MAX){printf("overflow"); }
q.rear++;
q.data[q.rear]=x;
}
//(4)出队一个元素,输出该元素;
int OutsqQueue(Queue &q,bitree &p)
{
if(EmptyQueue(q))
{
printf("underflow");
return 0;
}
else
{
p=q.data[q.front+1];
q.front++;
}
if(EmptyQueue(q))
{q.front=0;q.rear=0;}
return 1;
}
void InitBiTree(bitree &T) // 构造空二叉树
{
T=NULL;
}
int IsEmpty(bitree T)//判断二叉树是否为空
{ if(T==NULL)
return true;
else
return false;
}
void creatbitree(bitree &T)//创建一棵非空二叉树
{
int num;
cin>>num;
if(num==0)
T=NULL;
else
{
T=(bitree)malloc(sizeof(Binode));
T->data=num;
creatbitree(T->lchild);
creatbitree(T->rchild);
}
}
int Root(bitree T)//返回此二叉树的根节点
{bitree p;
p=T;
if(T==NULL)return 0;
else return p->data;
}
int nodeexist(bitree T,bitree p)//判定节点是否在二叉树中
{
if(T==NULL||p==NULL) return false;
if(T==p)return true;
else return nodeexist(T->rchild,p)||nodeexist(T->lchild,p);
}
int Value(bitree T,bitree p)//返回此二叉树中节点p的值
{
if(T==NULL||p==NULL) return false;
if(T==p)return p->data;
else return Value(T->rchild,p)||Value(T->lchild,p);
}
bitree Parent(bitree T,bitree p)//此二叉树中节点p的双亲
{
bitree n;
if(p==T) return NULL;
else if(p==T->lchild||p==T->rchild) return T;
else
{
if(n==Parent(T->lchild,p))
return n;
return Parent(T->rchild,p);
}
}
int LeftChild(bitree T,bitree n) //返回此二叉树中节点p的左孩子
{
if(T==NULL||n==NULL) return false;
if(T==n)return n->lchild->data;
else return LeftChild(T->rchild,n)|| LeftChild(T->lchild,n);
//if(!nodeexist(T,n))
// return NULL;
//else return (n->lchild->data);
}
int RightChild(bitree T,bitree n)//返回此二叉树中节点p的右孩子
{
if(T==NULL||n==NULL) return false;
if(T==n)return n->lchild->data;
else return RightChild(T->rchild,n)|| RightChild(T->lchild,n);
//if(!nodeexist(T,n))
//return NULL;
//else return (n->rchild->data);
}
int InOrderTraverse(bitree T)//返回二叉树的中序遍历序列
{
if(T==NULL)
return 0;
else
{
InOrderTraverse(T->lchild);
cout<<T->data;
InOrderTraverse(T->rchild);
}
}
int PreOrderTraverse(bitree T)//返回二叉树的先序遍历序列
{
if(T==NULL)
return 0;
else
{
cout<<T->data;
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int PostOrderTraverse(bitree T)//返回二叉树的后序遍历序列
{
if(T==NULL)
return 0;
else
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
cout<<T->data;
}
}
int count(bitree T)//节点数
{
if(T==NULL)
return 0;
else
return (count(T->lchild)+count(T->rchild)+1);
}
int depth(bitree T)//二叉树的深度
{
int rcount,lcount;
if(T==NULL)
return 0;
else
{
lcount=depth(T->lchild);
rcount=depth(T->rchild);
}
if(lcount>rcount)
return (lcount+1);
else
return (rcount+1);
}
void Destroybitree(bitree &T)// 销毁二叉树
{
if(T)
{
if(T->lchild)
Destroybitree(T->lchild);
if(T->rchild)
Destroybitree(T->rchild);
free(T);
T=NULL;
}
}
void LevelOrderTraverse(bitree T)// 层序遍历二叉树
{
Queue q;
InitQueue(q);
bitree p,p1,p2;
p=T;//(Tree)malloc(sizeof(TreeNode));
if(p)InsqQueue(q,p);
while(!EmptyQueue(q))
{
OutsqQueue(q,p);
printf("%d",p->data);
p1=p->lchild;p2=p->rchild;
if(p1) InsqQueue(q,p1);
if(p2) InsqQueue(q,p2);
}
}
#endif