BTree.h   (结构定义, 基本操作, 遍历)

 #define MS 10

 typedef struct BTreeNode{
char data;
struct BTreeNode * left
struct BTreeNode * right;
}BTreeNode; BTreeNode* InitBTree();
/*初始化二叉树,即把树根指针置空*/
BTreeNode* CreateBtree(char *a);
/*根据a所指向的二叉树广义表字符串建立对应的存储结构,返回树根指针*/
int BTreeEmpty(BTreeNode* BT);
/*判断一颗二叉树是否为空,若是则返回1,否则返回0*/
void Preorder(BTreeNode * BT);
/*先序遍历的递归算法*/
void Inorder(BTreeNode * BT);
/*中序遍历的地鬼算法*/
void Postorder(BTreeNode * BT);
/*后序遍历的递归算法*/
void Levelorder(BTreeNode* BT);
/*按层遍历由BT指针所指向的二叉树*/
void Inorder(BTreeNode* BT);
/*对二叉树进行中序遍历的非递归算法*/
int BTreeDepth(BTreeNode * BT);
/*求BT指向的一颗二叉树深度*/
char* FindBTree(BTreeNode * BT, char x);
/*从BT所指向的二叉树中查找值为x的节点*/
void PrintBTree(BTreeNode* BT);
/*输出二叉树的广义表表示*/
BTreeNode* ClearBTree(BTreeNode* BT);
/*清除二叉树中的所有节点,使之成为一颗空树*/

BTree.c   (二叉树的接口实现)

 void Preorder(BTreeNode * BT){

      if(BT != NULL){
putchar(BT->data); //访问根节点
Preorder(BT->left); //先序遍历左子树
Preorder(BT->right); //先序遍历右子树
}
} void Inorder(BTreeNode * BT){
if(BT != NULL){
Inorder(BT->left); //中序遍历左子树
putchar(BT->data); //访问根节点
Inoreder(BT->right); //中序遍历右子树
}
} void InorderN(BTreeNode* BT){
/*对二叉树进行中序遍历的非递归算法*/
BTreeNode* s[]; //定义用于存储节点指针的栈
int top = -; //定义栈顶指针并赋初值使s栈为空
BTreeNode* p = BT; //定义指针p并使树根指针为它的初值
while(top != - || p != NULL){
/*当栈非空或p指针非空时执行循环*/
while(p != NULL){
/*依次向下访问左子树并使树根指针进栈*/
top++;
s[top] = p;
p = p->left;
}
if(top != -){
/*树根指针出栈并输出节点的值,接着访问右子树*/
p = s[top];
top--;
putchar(p->data);
p = p->right;
}
}
}
void Postorder(BTreeNode * BT){
if(BT != NULL){
Postorder(BT->left); //后序遍历左子树
Postorder(BT->right); //后序遍历右子树
putchar(BT->data); //访问根节点
}
}
void Levelorder(BTreeNode* BT){
/*按层遍历由BT指针所指向的二叉树*/
/*定义队列所使用的数组空间,元素类型为指向节点的指针类型*/
BTreeNode* q[MS]; //MS为事先定义的符号常量
/*定义队首指针和队尾指针,初始均置0表示空队*/
int front = , rear = ;
/*将树根指针进队*/
if(BT != NULL)
rear = (rear + ) % MS;
q[rear] = BT;
}
/*当队列非空时执行循环*/
while(front !- rear){
BTreeNode* p; //定义指针变量p
/*使队首指针指向队首
BTreeNode* InitBTree(){
/*初始化二叉树,即把树根指针置空*/
return NULL;
} BTreeNode* CreateBtree(char *a){
/*根据a所指向的二叉树广义表字符串建立对应的存储结构,返回树根指针*/
BTreeNode * p = NULL;
/*定义S数组作为存储根节点指针的栈使用*/
BTreeNode* S[MS]; //MS事先定义的符号常量
/*定义top作为S栈的栈顶指针,初值为-1,表示空栈*/
int top = -;
/*用k作为处理节点的左子树和右子树的标记,k=1处理左子树,k=2处理右子树*/
int k;
/*用i扫描数组a中存储的二叉树广义表字符串,初值为0*/
int i = ;
/*把树根指针置为空,即从空树开始建立二叉树,待建立二叉树结束后返回*/
BTreeNode BT = NULL;
/*每循环一次处理一个字符,知道扫描到字符串结束符'\0’为止*/
while(a[i]){
switch(a[i]){
case ' ':/*对空格不做任何处理,退出此switch语句*/
case '(':
if(top == MS-){
printf("栈空间太小,需增加MS的值!\n");
exit();
}
if(p == NULL){
printf("p值不能为空,退出程序!\n");
exit();
}
top++;
s[top] = p;
k = ;
p = NULL;
break;
case ')':
if(top == -){
printf("二叉树广义表字符串有错!\n");
exit();
}
top--;
break;
case ',':
k = ;
break;
default:
if((a[i] >= 'a' && a[i] <= 'z' || a[i] >= 'A' && a[i] <= 'Z')){
p = malloc(sizeof(BTreeNode));
p->data = a[i];
p->left = p->right = NULL;
if(BT == Null) BT = P;
else{
if(k == )s[top]->lef = p;
else s[top]->right = p;


else{
printf("广义表字符串出错!\n");
exit();
}
}
/*为扫描下一个字符修改i值*/
i++;
}
return BT;
}
int BTreeEmpty(BTreeNode* BT){
/*判断一颗二叉树是否为空,若是则返回1,否则返回0*/
if(BT== NULL) return ;
else return ;
} int BTreeDepth(BTreeNode * BT){
/*求BT指向的一颗二叉树深度*/
if(BT != NULL) return ;
else{
/*计算左子树深度*/
int dep1 = BTreeDepth(BT->left);
/*计算右子树深度*/
int dep1 = BTreeDepth(BT->right); /*返回树的深度*/
if(dep1 > dep2) return dep1 + ;
else return dep2 + ;
}
} char* FindBTree(BTreeNode * BT, char x){
/*从BT所指向的二叉树中查找值为x的节点*/
if(BT == NULL) return NULL;
else{
/*树节点的值等于x则返回元素地址*/
if(BT->data == x) return &(BT->data);
else{
char* p;
/*向左子树查找若成功则继续返回元素的地址*/
if(p = FindBTree(BT->left,x)) return p;
/*向右子树查找若成功则继续返回元素的地址*/
if(p = FindBTree(BT->right,x)) return p;
/*左右子树查找均失败则返回空*/
return NULL;
}
}
} void PrintBTree(BTreeNode* BT){
/*输出二叉树的广义表表示*/
/*树为空时自然结束递归,否则执行如下操作*/
if(BT != NULL){
/*输出根节点的值*/
putchar(BT->data);
/*输出左右子树*/
if(BT->left != NULL || BT->right != NULL){
putchar('('); //输出左括号
PrintBTree(BT->left); //输出左子树
if(BT->right != NULL) putchar(','); //若右子树不为空则输出逗号分隔符 PrintBTree(BT -> right); //输出右子树
putchar(')'); //输出右括号
}
}
} BTreeNode* ClearBTree(BTreeNode* BT){
if(BT == NULL) return NULL;
else{
ClearBTree(BT->left); //删除左子树
ClearBTree(BT->right); //删除右子树
free(BT); //释放根节点
return NULL; //返回空指针
}
}

BTreeTest.c   (二叉树运算调试程序)

 #include "BTree.h"

 int main(void){
BTreeNode *p;
char *k;
int n1;
char *a = "A(B(C),D(E(F,G),H(,I)))";
P = InitBTree(); //建立空树
p = CreateBTree(a); //按照广义表形式的二叉树建立二叉链表
Preorder(p); putchar('\n'); //先序遍历
Inorder(p) putchar('\n'); //中序遍历
Postorder(p) putchar('\n'); //后序遍历
Levelorder(p) putchar('\n'); //按层遍历
InorderN(p) putchar('\n'); //中序非递归遍历
printf("%d\n",BTreeDepth(p)); //求二叉树深度
k = FindBTree(p, 'I'); if(k!=NULL) printf("%c\n", *k); //查找二叉树
PrintBTree(p); //输出二叉树
p = ClearBTree(p); //清空二叉树
n1 = BTreeEmpty(P); printf("%d\n", n1); //判断树是否为空 }

二叉树 ADT接口 遍历算法 常规运算的更多相关文章

  1. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

  2. 图 ADT接口 遍历运算 常规运算 邻接矩阵实现

    Graph.h   (图的结构, 遍历, 常规操作接口) /*定义图的最大定点数, 它要大于等于具体图的顶点树n*/ #define MaxVertexNum 12 /*定义图的最大边数,它要大于等于 ...

  3. Go语言二叉树定义及遍历算法实现

    // binary_tree 二叉树 package Algorithm import ( "reflect" ) // 二叉树定义 type BinaryTree struct ...

  4. [LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

    描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分层遍历结果: [ [3] ...

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  7. 毕业了-java二叉树层次遍历算法

    /*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直 ...

  8. 算法 dfs —— 将二叉树 先序遍历 转为 链表

    将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...

  9. 算法:二叉树的层次遍历(递归实现+非递归实现,lua)

    二叉树知识参考:深入学习二叉树(一) 二叉树基础 递归实现层次遍历算法参考:[面经]用递归方法对二叉树进行层次遍历 && 二叉树深度 上面第一篇基础写得不错,不了解二叉树的值得一看. ...

随机推荐

  1. Current_Path 获取脚本所在路径(当前路径),取当前时间做文件名(uformat)

    获取脚本当前所在路径: $CurrentPath = $MyInvocation.MyCommand.Path.substring(0,$MyInvocation.MyCommand.Path.Las ...

  2. vSan中见证组件witness详解

    witness在vSan中作为见证组件其作用类似于WinServer中的仲裁磁盘,当Cluster中某一节点发生故障时,来判断该节点上的对象在哪一个新的节点上继续承载.此处需要强调的是,witness ...

  3. execl execv

    int execl(const char *path, const char *arg, ...); 函数说明 execl()其中后缀"l"代表list也就是参数列表的意思第一参数 ...

  4. linux c编程调用系统的动态库时,要使用dlopen等函数吗?

    同问 linux c编程调用系统的动态库时,要使用dlopen等函数吗? 2012-11-27 21:55 提问者: hnwlxyzhl 我来帮他解答 满意回答 2012-12-07 09:08 li ...

  5. 021.3 IO流——字节流-FileInputStream读取字节

    内容:文件读取方法,读取方法例子,read(buf)方法中buf的取值,字节流缓冲区对象—提高读取速度/// 文件读取方法:fis.read(),fis.read(buf),具体看例子 例子:文件读取 ...

  6. 【转】iphone 输入/输出流异步读写数据

    原文:iphone 输入/输出流异步读写数据 分类: iphone2012-05-30 14:50 2484人阅读 评论(1) 收藏 举报 iphoneattributesinterfacepaths ...

  7. iOS-建设银行破解分享

    https://i.cnblogs.com/Files.aspx 建设银行破解分享 问题描述一• 在越狱手机上控制银行客户端自动获取流水,并发送到服务器. 问题描述二• 怎么控制 • 通过在越狱手机上 ...

  8. Vuex、Flux、Redux、Redux-saga、Dva、MobX

    https://www.jqhtml.com/23003.html 这篇文章试着聊明白这一堆看起来挺复杂的东西.在聊之前,大家要始终记得一句话:一切前端概念,都是纸老虎. 不管是Vue,还是 Reac ...

  9. Odoo中要根据某字段值作为条件判断值,但又不想在界面显示

    在视图标签中包含这个field(包含这个字段才可以使用该字段),但其invisible属性设置为1,即:该字段不可见. <field name="字段" invisible= ...

  10. Extjs自定义验证介绍

    表单验证实例(空验证,密码确认验证,email验证) 我们可以用单独的js写表单验证,但是extjs已经为我们想到了(自己单独写反而不方便). 在验证之前,我不得不提两个小知识点: //大家在很多的e ...