// A code block
二叉树的一些基本操作
1. 层序遍历
2. 先序遍历
3. 后序遍历
4. 中序遍历
5. 倒叙遍历
6. 求树高
7. 求叶子节点数
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define MAXSIZE 60
#define datatype char
struct Tree
{
Tree *lchild;
Tree *rchild;
datatype data;
};
struct Queue
{
Tree *data[MAXSIZE];
int front;
int rear;
};
struct Stack
{
Tree *data[MAXSIZE];
int top;
};
int LeafNodeNum = 0;
void GetNumLeafNode(Tree *tree);
void ShowNode(Tree *tree);
void RearShow(Tree *tree);
void PirorShow(Tree *tree);
int GetHeight(Tree *tree);
void LayerShow(Tree *tree);
bool EnQueue(Queue &queue,Tree *tree);
Tree *ExQueue(Queue &queue);
Queue CreateQueue();
Tree *CreateBTree();
int max(int n,int m);
void InitStack(Stack &stack);
Tree *PopStack(Stack &stack);
bool PushStack(Stack &stack,Tree *tree);
void ShowStack(Stack stack);
void OverLayerShow(Tree *tree);
void ShowStack(Stack stack){
while(stack.top!=-1){
Tree *node = stack.data[stack.top--];
printf("%c\t",node->data);
}
}
void InitStack(Stack &stack){
stack.top = -1;
}
Tree *PopStack(Stack &stack){
if(stack.top == -1)
return NULL;
return stack.data[stack.top--];
}
bool PushStack(Stack &stack,Tree *tree){
if(stack.top == MAXSIZE -1)
return false;
stack.data[++stack.top] = tree;
return true;
}
int max(int n,int m){
return n>m?n:m;
}
Tree *CreateBTree()
{
Tree *bt = NULL;
char ch;
scanf("%c", &ch);
if (ch != '#')
{
bt = (Tree*)malloc(sizeof(Tree));
bt->data = ch;
bt->lchild = CreateBTree();
bt->rchild = CreateBTree();
}
return bt;
}
void GetNumLeafNode(Tree *tree){
if(!tree)
return;
if(tree->rchild ==NULL && tree->lchild ==NULL)
LeafNodeNum++;
GetNumLeafNode(tree->lchild);
GetNumLeafNode(tree->rchild);
}
void ShowNode(Tree *tree){
if(!tree)
return;
ShowNode(tree->lchild);
printf("%c\t",tree->data);
ShowNode(tree->rchild);
}
void RearShow(Tree *tree){
if(!tree)
return ;
RearShow(tree->lchild);
RearShow(tree->rchild);
printf("%c\t",tree->data);
}
void PirorShow(Tree *tree){
if(!tree)
return ;
printf("%c\t",tree->data);
RearShow(tree->lchild);
RearShow(tree->rchild);
}
int GetHeight(Tree *tree){
if(!tree)
return 0;
return max(GetHeight(tree->lchild),GetHeight(tree->rchild)) + 1;
}
bool EnQueue(Queue &queue,Tree *tree){
if((queue.rear+1)%MAXSIZE == queue.front)
return false;
queue.data[queue.rear] = tree;
queue.rear = (queue.rear+1)%MAXSIZE;
return true;
}
Tree *ExQueue(Queue &queue){
if(queue.rear == queue.front)
return NULL;
Tree *node = queue.data[queue.front];
queue.front = (queue.front+1)%MAXSIZE;
return node;
}
Queue CreateQueue(){
Queue queue;
queue.front = queue.rear = -1;
return queue;
}
void LayerShow(Tree *tree){
Queue queue = CreateQueue();
EnQueue(queue,tree);
while(queue.front!=queue.rear){
Tree *node = ExQueue(queue);
printf("%c\t",node->data);
if(node->lchild!=NULL){
EnQueue(queue,node->lchild);
}
if(node->rchild!=NULL){
EnQueue(queue,node->rchild);
}
}
}
void OverLayerShow(Tree *tree){
Stack stack;
InitStack(stack);
Queue queue = CreateQueue();
EnQueue(queue,tree);
while(queue.front!=queue.rear){
Tree *node = ExQueue(queue);
PushStack(stack,node);
if(node->lchild!=NULL){
EnQueue(queue,node->lchild);
}
if(node->rchild!=NULL){
EnQueue(queue,node->rchild);
}
}
ShowStack(stack);
}
int main(){
Tree *Root;
Root = CreateBTree();
ShowNode(Root);
printf("\n");
LayerShow(Root);
printf("\n Reverse Show: ");
OverLayerShow(Root);
GetNumLeafNode(Root);
printf("\n LeafNodeNum:%d",LeafNodeNum);
printf("\n Height:%d\n",GetHeight(Root));
system("pause");
return 0;
}