#include "stdio.h"
#include "malloc.h"
#define MAXSIZE 20
//二叉树结点的结构体表示形式
typedef struct node
{
char data;
struct node *left,*right;
}BTree;
//栈的结构体表示形式
typedef struct stackelem
{
BTree* a[MAXSIZE];
int top;
}Stack;
//队列的结构体的表示形式
typedef struct queueelem
{
BTree* b[MAXSIZE];
int front,rear;
}Queue;
//先序遍历创建二叉树,利用递归的方法
BTree* Create()
{
char ch;
scanf("%c",&ch);
getchar();
if (ch=='#')
{
return NULL;
}
else
{
BTree* btree=(BTree*)malloc(sizeof(BTree));
if (NULL==btree)
{
return NULL;
}
//中序遍历和后序遍历与先序遍历 只是顺序的不同。
btree->data=ch;
btree->left=Create();
btree->right=Create();
return btree;
}
}
//前序遍历,递归的方法
void Preorder(BTree* bt)
{
if (NULL!=bt)
{
printf("%c ",bt->data);
Preorder(bt->left);
Preorder(bt->right);
}
}//当不满足if时函数递归结束
//前序遍历的非递归实现
/*
思想:利用栈来实现,根节点进栈,之后栈非空,弹出,接着
根节点的右结点进栈,之后,左结点进栈,接着,弹出栈顶元素(输出)
此节点的右结点进栈,之后左结点进栈,弹出栈顶元素(输出)一直下去,知道栈为空、
*/
//求二叉树的高度,递归实现
int Height(BTree* bt)
{
int depth1,depth2;
if (NULL==bt)
{
return 0;
}
else
{
depth1=Height(bt->left);
depth2=Height(bt->right);
if (depth1>depth2)
{
return (depth1+1);
}
else
{
return (depth2+1);
}
}
}
//层次遍历二叉树,用队列来实现
void TraversalOfLevel(BTree* bt)
{
Queue q;
q.front=q.rear=0;
if (bt!=NULL)
{
printf("%c ",bt->data);
}
q.b[q.front]=bt;
q.rear=q.rear+1;
while (q.front<q.rear)
{
bt=q.b[q.front];
q.front=q.front+1;
if (bt->left!=NULL)
{
printf("%c ",bt->left->data);
q.b[q.rear]=bt->left;
q.rear=q.rear+1;
}
if (bt->right!=NULL)
{
printf("%c ",bt->right->data);
q.b[q.rear]=bt->right;
q.rear=q.rear+1;
}
}
}
int main()
{
BTree* btr=Create();
printf("前序遍历:递归和非递归实现:\n");
Preorder(btr);
printf("\n二叉树的高度:%d\n",Height(btr));
printf("层次遍历:\n");
TraversalOfLevel(btr);
return 0;
}
#include "malloc.h"
#define MAXSIZE 20
//二叉树结点的结构体表示形式
typedef struct node
{
char data;
struct node *left,*right;
}BTree;
//栈的结构体表示形式
typedef struct stackelem
{
BTree* a[MAXSIZE];
int top;
}Stack;
//队列的结构体的表示形式
typedef struct queueelem
{
BTree* b[MAXSIZE];
int front,rear;
}Queue;
//先序遍历创建二叉树,利用递归的方法
BTree* Create()
{
char ch;
scanf("%c",&ch);
getchar();
if (ch=='#')
{
return NULL;
}
else
{
BTree* btree=(BTree*)malloc(sizeof(BTree));
if (NULL==btree)
{
return NULL;
}
//中序遍历和后序遍历与先序遍历 只是顺序的不同。
btree->data=ch;
btree->left=Create();
btree->right=Create();
return btree;
}
}
//前序遍历,递归的方法
void Preorder(BTree* bt)
{
if (NULL!=bt)
{
printf("%c ",bt->data);
Preorder(bt->left);
Preorder(bt->right);
}
}//当不满足if时函数递归结束
//前序遍历的非递归实现
/*
思想:利用栈来实现,根节点进栈,之后栈非空,弹出,接着
根节点的右结点进栈,之后,左结点进栈,接着,弹出栈顶元素(输出)
此节点的右结点进栈,之后左结点进栈,弹出栈顶元素(输出)一直下去,知道栈为空、
*/
//求二叉树的高度,递归实现
int Height(BTree* bt)
{
int depth1,depth2;
if (NULL==bt)
{
return 0;
}
else
{
depth1=Height(bt->left);
depth2=Height(bt->right);
if (depth1>depth2)
{
return (depth1+1);
}
else
{
return (depth2+1);
}
}
}
//层次遍历二叉树,用队列来实现
void TraversalOfLevel(BTree* bt)
{
Queue q;
q.front=q.rear=0;
if (bt!=NULL)
{
printf("%c ",bt->data);
}
q.b[q.front]=bt;
q.rear=q.rear+1;
while (q.front<q.rear)
{
bt=q.b[q.front];
q.front=q.front+1;
if (bt->left!=NULL)
{
printf("%c ",bt->left->data);
q.b[q.rear]=bt->left;
q.rear=q.rear+1;
}
if (bt->right!=NULL)
{
printf("%c ",bt->right->data);
q.b[q.rear]=bt->right;
q.rear=q.rear+1;
}
}
}
int main()
{
BTree* btr=Create();
printf("前序遍历:递归和非递归实现:\n");
Preorder(btr);
printf("\n二叉树的高度:%d\n",Height(btr));
printf("层次遍历:\n");
TraversalOfLevel(btr);
return 0;
}