// BinaryTree.cpp : 定义控制台应用程序的入口点。
//
#include "stdio.h"
#include "string.h"
#include "malloc.h"
int ntotal = 0,nleaf = 0;//ntotal表示总共节点,nleaf表示叶子节点
#define N 50
struct Node{
char info;
struct Node *parent;
struct Node *lchild;
struct Node *rchild;
};
typedef struct Node * PNode,BiNode;
struct Stack{
char *pre;
char *in;
int n;
PNode parent;
};
typedef struct _QNode//把二叉树树转化为链表形式存储
{
BiNode* data;
struct _QNode* next;
}QNode;
typedef struct _queue//队列结构
{
QNode* front;
QNode* rear;
}Queue;
void InitQueue(Queue* q)//初始化队列
{
q->front = q->rear = (QNode*)malloc(sizeof(QNode));
q->front->next = NULL;
}
bool isQueueEmpty(Queue* q)//判断队列是否为空
{
if(q->front == q->rear)
return true;
else
return false;
}
void EnQueue(Queue* q, BiNode* data)//向队列的末尾增加一个元素
{
QNode* pNode;
pNode = (QNode*)malloc(sizeof(QNode));
pNode->data = data;
pNode->next = NULL;
q->rear->next = pNode;//接入队列的末尾
q->rear = pNode;//把队列的尾指针指向新添加的节点
}
BiNode* DeQueue(Queue* q)//删除队列中的一个节点
{
QNode* pNode;
BiNode* pData;
//assert(q->front != q->rear);
pNode = q->front->next;
q->front->next = pNode->next;
if(q->rear == pNode)
{
q->rear = q->front;
}
pData = pNode->data;
free(pNode);
return pData;
}
void DestroyQueue(Queue* q)//销毁整个队列
{
while(NULL != q->front)
{
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
}
//二叉树的层次遍历,使用链队列实现
void LayerOrderTraverse(BiNode* T)
{
Queue q;
if(NULL == T)
return;
InitQueue(&q);
EnQueue(&q,T);
while(!isQueueEmpty(&q))
{
T = DeQueue(&q);
printf("%c ",T->info);
if(T->lchild)
EnQueue(&q,T->lchild);
if(T->rchild)
EnQueue(&q,T->rchild);
}
DestroyQueue(&q);
}
int myIndex(char seq[],char c)
{
int i;
for(i = 0;seq[i] != '/0' ;i ++)
{
if(seq[i] == c)
{
return i;
}
}
return -1;
}
PNode CreateTree(char pre[],char in[],int n,PNode parent)
{
PNode p,head = NULL;
struct Stack S[N],t;
int i,top = 0,done = 0;
while(!done)
{
while(n != 0)
{
i = myIndex(in,pre[0]);
p = (PNode)malloc(sizeof(struct Node));
p->info = pre[0];
p->parent = parent;
p->lchild = NULL;
p->rchild = NULL;
if(parent == NULL)
{
head = p;
}
else
{
parent->lchild = p;
}
if(n - i - 1 != 0)
{
t.pre = pre + i + 1;
t.in = in + i + 1;
t.n = n - i - 1;
t.parent = p;
S[++top] = t;
}
pre = pre + 1;
n = i;
parent = p;
}
if(top != 0)
{
t = S[top--];//当初把这个地方赋值弄反了,导致结果错误!!
pre = t.pre;
in = t.in;
n = t.n;
parent = t.parent;
i = myIndex(in,pre[0]);
p = (PNode)malloc(sizeof(struct Node));
p->info = pre[0];
p->parent = parent;
p->lchild = NULL;
p->rchild = NULL;
if(parent == NULL)
{
head = p;
}
else
{
parent->rchild = p;
}
if(n - i - 1 != 0)
{
t.pre = pre + i + 1;
t.in = in + i + 1;
t.n = n - i - 1;
t.parent = p;
S[++top] = t;
}
pre = pre + 1;
n = i;
parent = p;
}
else
{
done = 1;
}
}
return head;
}
void pre_order(PNode root)
{
if(root != NULL)//必不可少的条件,递归的出口
{
printf("%2c",root->info);
pre_order(root->lchild);
pre_order(root->rchild);
}
}
void in_order(PNode root)
{
if(root != NULL)//必不可少的条件,递归的出口
{
in_order(root->lchild);
printf("%2c",root->info);
in_order(root->rchild);
}
}
void later_order(PNode root)
{
if(root != NULL)//必不可少的条件,递归的出口
{
later_order(root->lchild);
later_order(root->rchild);
printf("%2c",root->info);
}
}
int TreeDepth(PNode root)
{
int nLeft, nRight;
if(root == NULL)//必不可少的条件,递归的出口
return 0;
nLeft = TreeDepth(root->lchild);
nRight = TreeDepth(root->rchild);
return (nLeft > nRight) ? (nLeft + 1):(nRight + 1);
}
int totalnode(PNode root)
{
if(root != NULL)//必不可少的条件,递归的出口
{
ntotal ++;
totalnode(root->lchild);
totalnode(root->rchild);
}
return ntotal;
}
int leafnode(PNode root)
{
if(root != NULL)//必不可少的条件,递归的出口
{
if((root->lchild == NULL) && (root->rchild == NULL) )
{
nleaf ++;
}
leafnode(root->lchild);
leafnode(root->rchild);
}
return nleaf;
}
int main()
{
PNode root;
// char pre[N],in[N];//分别表示前序序列和中序序列
int depth,ntotalnode,nleafnode;
//printf("请输入前序遍历:");
//scanf("%s",pre);
char* pre = "abdecfg";
//printf("请输入中序遍历:");
//scanf("%s",in);
char *in = "dbeacgf";
root = CreateTree(pre,in,strlen(pre),NULL);
printf("\n前序遍历为:");
pre_order(root);
printf("\n中序遍历为:");
in_order(root);
printf("\n后序遍历为:");
later_order(root);
depth = TreeDepth(root);
printf("\n树的深度为:%d\n",depth);
ntotalnode = totalnode(root);
printf("总共节点为:%d\n",ntotalnode);
nleafnode = leafnode(root);
printf("总共叶子节点为:%d\n",nleafnode);
printf("\n二叉树的层次遍历为:");
LayerOrderTraverse(root);
printf("\n\n");
return 0;
}