二叉树的用法
来源:互联网 发布:淘宝短连接在线生成 编辑:程序博客网 时间:2024/04/28 09:52
1)用二叉链表作为存储结构;
2)分别按先序,中序和后序遍历二叉树;
3)编写交换二叉树中所有结点左右孩子的非递归算法。
二、实验方案
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
typedef char elemType;
#endif
struct BTreeNode{
elemType data;
struct BTreeNode *lchild;
struct BTreeNode *rchild;
};
/* 1.初始化二叉树 */
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL;
return;
}
/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */
void createBTree(struct BTreeNode* *bt, char *a)
{
struct BTreeNode *p;
struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */
int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */
int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */
int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */
*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */
/* 每循环一次处理一个字符,直到扫描到字符串结束符/0为止 */
while(a != '/0'){
switch(a )
{
case ' ': break; /* 对空格不作任何处理 */
case '(':
if(top == STACK_MAX_SIZE - 1){
printf("zhankongjiantaixiao!/n");
exit(1);
}
top++;
s[top] = p;
k = 1;
break;
case ')':
if(top == -1){
printf("erchashuguangyibiaozifucuancuowu!/n");
exit(1);
}
top--;
break;
case ',':
k = 2;
break;
default:
p=malloc(sizeof(struct BTreeNode));
p->data = a ;
p->lchild = p->rchild = NULL;
if(*bt==NULL){
*bt = p;
}else
{
if( k == 1){
s[top]->lchild = p;
}else
{
s[top]->rchild = p;
}
}
}
i++; /* 为扫描下一个字符修改i值 */
}
return;
}
/* 前序遍历 */
void preOrder(struct BTreeNode *bt)
{
if(bt != NULL){
printf("%c ", bt->data); /* 访问根结点 */
preOrder(bt->lchild); /* 前序遍历左子树 */
preOrder(bt->rchild); /* 前序遍历右子树 */
}
return;
}
/* 中序遍历 */
void inOrder(struct BTreeNode *bt)
{
if(bt != NULL){
inOrder(bt->lchild); /* 中序遍历左子树 */
printf("%c ", bt->data); /* 访问根结点 */
inOrder(bt->rchild); /* 中序遍历右子树 */
}
return;
}
/* 后序遍历 */
void postOrder(struct BTreeNode *bt)
{
if(bt != NULL){
postOrder(bt->lchild); /* 后序遍历左子树 */
postOrder(bt->rchild); /* 后序遍历右子树 */
printf("%c ", bt->data); /* 访问根结点 */
}
return;
}
/* 按层遍历 */
void levelOrder(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;/* 将树根指针进队 */
if(bt != NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear){ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data); /* 若结点存在左孩子,则左孩子结点指针进队 */
if(p->lchild != NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->lchild;
} /* 若结点存在右孩子,则右孩子结点指针进队 */
if(p->rchild != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->rchild;
}
}
return;
}
void change(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *k;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;/* 将树根指针进队 */
if(bt!= NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear)
{ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data);
if(p->lchild != NULL&&p->rchild != NULL) /* 若结点存在左孩子,则左孩子结点指针进队 */
{k=p->lchild;
p->lchild=p->rchild;
p->rchild=k;
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear]=p->lchild;
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear]=p->rchild;
}
else
if(p->lchild= NULL&&p->rchild!= NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->rchild;
}
else
if(p->rchild= NULL &&p->lchild!= NULL)
{
rear = (rear + 1) % QUEUE_MAX_SIZE;
- 二叉树的用法
- 二叉树的用法
- 二叉树的用法
- 二叉树的基本用法总结
- 二叉树按层次遍历的递归用法
- 第10周项目2 -二叉树的便利的递归用法
- 二叉树的各种遍历,二叉树改链表,二叉树复习
- 二叉树的宽度(二叉树)
- 数据结构【二叉树】 二叉树的创建
- 二叉树------二叉查找树的相关内容
- 二叉树------二叉树的下一个结点
- 二叉树及特殊的二叉树
- 二叉树的深度(二叉树)
- 二叉树11:二叉树的深度
- 二叉树15:对称的二叉树
- 【二叉树】二叉树的下一个节点
- 二叉树的基本操作 【二叉树】
- 二叉树及二叉树的应用
- 电影《非诚勿扰》
- 男人最爱只有一个
- 我国将组织100万未就业毕业生参加见习
- ASP.NET组件与开发之复合控件的事件处理
- fdisk详解
- 二叉树的用法
- 解释传统与敏捷方法最贴切的故事:大象与猴子
- LINQ to SQL语句(6)之Group By/Having
- 详解linux下的串口通讯开发
- 我生命的火种
- 合理规划您的硬盘分区
- 电视剧《闯关东》
- Linux 查看磁盘分区、文件系统、使用情况的命令和相关工具介绍
- jQuery入门指南教程