二叉树的基本操作
来源:互联网 发布:在职法律硕士 知乎 编辑:程序博客网 时间:2024/06/07 00:04
#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;
}
0 0
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- 二叉树的基本操作
- X64 平台 C/C++调用汇编代码
- SSH协议介绍
- Python - screenshot with PIL
- MYSQL CLUSTER 7.4 + 5.6 创建磁盘表和内存表
- [授权发表]内核探索:Linux BogoMips 探秘
- 二叉树的基本操作
- Xamarin MAC部署
- Web Service--入门
- RSync实现文件备份同步
- 二叉树的创建insert
- objective-C第十五章课后练习答案
- 51单片机 11.0592MHz 产生115200 波特率
- Session与Cookies
- linux应用开发-进程管理