#include<stdio.h>
//#include<string.h>
//#include<math.h>
#include<stdlib.h>
//函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define NULL 0
#define MAXSIZE 100
#define MAXTSIZE 100
//Status是函数的类型,其值是函数结果状态代码
typedef int Status;
//声明结点的类型和指向结点的指针类型
//顺序存储结构
typedef int SqBiTree[MAXTSIZE];
//二叉链表存储结构
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild;//左右孩子指针
}BiNode,*BiTree;
//三叉链表存储结构
typedef struct TriNode{
TElemType data;
struct TriNode *lchild,*parent,*rchild;//左右孩子指针、双亲指针
}TriNode,*TriTree;
//线索二叉树
typedef struct BiThrNode{
int data;
int ltag,rtag;
struct BiThrNode *lchild,*rchild;//左右孩子指针
}BiThrNode,*BiThrTree;
//二叉链表 先序遍历——DLR
Status PreOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
visit(T);//访问根结点,这里也可以输出根节点printf("%d\t",T->data);
PreOrderTraverse(T->lchild);//递归遍历左子树
PreOrderTraverse(T->rchild);//递归遍历右子树
}
}
//二叉链表 中序遍历——LDR
Status InOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
InOrderTraverse(T->lchild);//递归遍历左子树
visit(T);//访问根结点
InOrderTraverse(T->rchild);//递归遍历右子树
}
}
//二叉链表 后序遍历——LRD
Status PostOrderTraverse(BiTree T){
if(T==NULL) return OK;//空二叉树
else{
PostOrderTraverse(T->lchild);//递归遍历左子树
PostOrderTraverse(T->rchild);//递归遍历右子树
visit(T);//访问根结点
}
}
//二叉链表 中序遍历——非递归算法
Status InOrderTraverse(BiTree T){
BiTree p;
InitStack(S);//初始化栈
p=T;//指针p指向根结点T
while(p||!StackEmpty(S)){
if(p){
Push(S,p);//当前的根结点p入栈
p=p->lchild;//p指向左子树
}
else{
Pop(S,q);//将栈顶元素弹出,并赋值给q
printf("%c\t",q->data);
p=q->rchild;//p指向右子树
}
}
return OK;
}
//二叉链表 层次遍历(从上到下、从左到右的顺序访问每一个结点)
void LevelOrder(BiNode *b){
BiNode *p;
SqQueue *qu;
InitQueue(qu);//初始化队列
enQueue(qu,b);//根结点指针进入队列
while(!QueueEmpty(qu)){//队列不为空,执行循环
deQueue(qu,p);//结点p出队
printf("%c\t",p->data);//访问结点p
if(p->lchild!=NULL) enQueue(qu,p->lchild);//如果有左子树,则左子树入队
if(p->rchild!=NULL) enQueue(qu,p->rchild);//如果有右子树,则右子树入队
}
}
//二叉链表 按先序遍历建立二叉树
Status CreateBiTree(BiTree &T){
scanf(&ch);//接收键盘输入的字符
if(ch=="#") T=NULL;
else{
if(!(T=(BiNode *)malloc(sizeof(BiNode)))) exit(OVERFLOW);//生成空间存放T
T->data=ch;//生成根结点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
return OK;
}
//二叉链表 复制二叉树
int Copy(BiTree T,BiTree &NewT){
if(T==NULL){
NewT=NULL;
return 0;
}
else{
NewT=(BiNode *)malloc(sizeof(BiNode));//生成新结点的存储空间
NewT->data=T->data;//复制当前结点数据到新结点
Copy(T->lchild,NewT->lchild);//复制左子树
Copy(T->rchild,NewT->rchild);//复制右子树
}
}
//二叉链表 计算二叉树的深度
int Depth(BiTree T){
if(T==NULL) return 0;
else{
m=Depth(T->lchild);//左子树深度
n=Depth(T->rchild);//右子树深度
if(m>n) return(m+1);
else return(n+1);//+1的原因是因为一开始的根结点的深度没计算进去
}
}
//二叉链表 计算二叉树结点总数
int NodeCount(BiTree T){
if(T==NULL) return 0;
else return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}
//二叉链表 计算二叉树叶子结点数
int LeadCount(BiTree T){
if(T==NULL) return 0;
if(T->lchild==NULL && T->rchild==NULL) return 1;//左子树和右子树都为空,当前结点是叶子结点
else return LeadCount(T->lchild)+LeadCount(T->rchild);
}
int main(){
return 0;
}