关于树和二叉树的部分,还有如下三个知识点,待以后时间更充裕的时候再回头完善。

1 树与等价问题

文字描述

关于等价关系和等价类的定义,在离散数学上的描述有点拗口, 其实在数据结构中,这部分相关的主要是如下三个函数:

示意图

算法分析:

代码实现

 //
// Created by lady on 18-12-15.
// #include <stdio.h>
#include <stdlib.h>
#include <string.h> #define MAX_TREE_SIZE 20 typedef char TElemType; /*
* 树的双亲表示法
*
* 以一组连续空间存储树的结点,同时在每个结点中附设一个指示器指示其双亲结点在链表中的位置。
*/
//结点结构
typedef struct PTNode{
//结点的数据域
TElemType data;
//结点的双亲位置域
int parent;
}PTNode;
//树的结构
typedef struct{
//树的结点
PTNode node[MAX_TREE_SIZE];
//树的根的位置
int r;
//树的结点数
int n;
}PTree; static void printMFSet(PTree *S)
{
printf("打印以树的双亲表示法表示的树:\n");
printf("树的结点数: %d\n", S->n);
printf("树的根的位置: %d\n", S->r);
int i = ;
for(i=; i<=S->n; i++)
{
printf("index %d: (data %c, parent %d)\n", i, S->node[i].data, S->node[i].parent);
}
printf("\n");
} //初始化操作, 构造一个由n个子集(每个子集只含单个成员xi)构成的集合S。
static int initialMFSet(PTree *S)
{
printf("构造一个由n个子集(每个子集只含单个成员xi)构成的集合S:\n");
printf("输入n的值:");
char tmp[] = {};
scanf("%d", &S->n);
int i = ;
for(i=; i<S->n; i++)
{
printf("输入第%d个子集的值:", i+);
memset(tmp, , sizeof(tmp));
scanf("%s", tmp);
S->node[i+].data = tmp[];
S->node[i+].parent = -;
}
S->r = ;
printf("\n");
return ;
} /* param1 S: S是已存在的集合
* param2 data: x是S中某个子集的成员
* result: 查找函数,确定S中x所属子集Si
*/
static int findMFSet(PTree *S, TElemType data)
{
int i = ;
int j = ;
int loc = -;
for(i=; i<=S->n; i++){
if(S->node[i].data == data){
loc = i;
break;
}
}
if(loc < ){
printf("数据data:%c在S集合中不存在!\n", data);
return -;
}
for(j=i; S->node[j].parent>; j=S->node[j].parent);
return j;
} //data_i和data_j所在的子集互不相交,
static int mergeMFSet(PTree *S, TElemType data_i, TElemType data_j)
{
int loc_i = -, loc_j = -;
if((loc_i=findMFSet(S, data_i)) < ){
return -;
}
if((loc_j=findMFSet(S, data_j)) < ){
return -;
} if(S->node[loc_i].parent > S->node[loc_j].parent){
//data_i所在子集的数目比data_j所在子集的数目少
S->node[loc_j].parent += S->node[loc_i].parent;
S->node[loc_i].parent = loc_j;
}else{
S->node[loc_i].parent += S->node[loc_j].parent;
S->node[loc_j].parent = loc_i;
}
return ;
} //确定data所在子集,并交data所在index到根路径上所有结点都变成根的孩子结点。
static int fixMFSet(PTree *S, TElemType data)
{
int index = -;
int parent = -;
int t = ;
int k = ;
for(t=; t<=S->n; t++){
if(S->node[t].data == data){
index = t;
break;
}
}
if(index < )
return ;
for(parent=index; S->node[parent].parent>; parent=S->node[parent].parent);
for(k=index; k!=parent; k=t){
t = S->node[k].parent;
S->node[k].parent = parent;
}
} int main(int argc, char *argv[])
{
PTree S;
initialMFSet(&S);
printMFSet(&S); printf("创建等价类:\n");
char tmp[] = {};
TElemType dataI, dataJ;
while(){
memset(tmp, , sizeof(tmp));
printf("输入一对数据,(0,0)表示结束:");
scanf("%s", tmp);
sscanf(tmp, "%c,%c", &dataI, &dataJ);
if(mergeMFSet(&S, dataI, dataJ) < ){
break;
}else{
printMFSet(&S);
}
}
printf("\n"); printf("现开始压缩路径, 输入要压缩的结点值: ");
memset(tmp, , sizeof(tmp));
scanf("%s", tmp);
fixMFSet(&S, tmp[]);
printMFSet(&S);
return ;
}

树与等价类

代码运行

/home/lady/CLionProjects/untitled/cmake-build-debug/untitled
构造一个由n个子集(每个子集只含单个成员xi)构成的集合S:
输入n的值:9
输入第1个子集的值:1
输入第2个子集的值:2
输入第3个子集的值:3
输入第4个子集的值:4
输入第5个子集的值:5
输入第6个子集的值:6
输入第7个子集的值:7
输入第8个子集的值:8
输入第9个子集的值:9 打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -1)
index 2: (data 2, parent -1)
index 3: (data 3, parent -1)
index 4: (data 4, parent -1)
index 5: (data 5, parent -1)
index 6: (data 6, parent -1)
index 7: (data 7, parent -1)
index 8: (data 8, parent -1)
index 9: (data 9, parent -1) 创建等价类:
输入一对数据,(0,0)表示结束:1,2
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -2)
index 2: (data 2, parent 1)
index 3: (data 3, parent -1)
index 4: (data 4, parent -1)
index 5: (data 5, parent -1)
index 6: (data 6, parent -1)
index 7: (data 7, parent -1)
index 8: (data 8, parent -1)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:3,4
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -2)
index 2: (data 2, parent 1)
index 3: (data 3, parent -2)
index 4: (data 4, parent 3)
index 5: (data 5, parent -1)
index 6: (data 6, parent -1)
index 7: (data 7, parent -1)
index 8: (data 8, parent -1)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:5,6
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -2)
index 2: (data 2, parent 1)
index 3: (data 3, parent -2)
index 4: (data 4, parent 3)
index 5: (data 5, parent -2)
index 6: (data 6, parent 5)
index 7: (data 7, parent -1)
index 8: (data 8, parent -1)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:7,8
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -2)
index 2: (data 2, parent 1)
index 3: (data 3, parent -2)
index 4: (data 4, parent 3)
index 5: (data 5, parent -2)
index 6: (data 6, parent 5)
index 7: (data 7, parent -2)
index 8: (data 8, parent 7)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:1,3
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -4)
index 2: (data 2, parent 1)
index 3: (data 3, parent 1)
index 4: (data 4, parent 3)
index 5: (data 5, parent -2)
index 6: (data 6, parent 5)
index 7: (data 7, parent -2)
index 8: (data 8, parent 7)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:5,7
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -4)
index 2: (data 2, parent 1)
index 3: (data 3, parent 1)
index 4: (data 4, parent 3)
index 5: (data 5, parent -4)
index 6: (data 6, parent 5)
index 7: (data 7, parent 5)
index 8: (data 8, parent 7)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:1,5
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -8)
index 2: (data 2, parent 1)
index 3: (data 3, parent 1)
index 4: (data 4, parent 3)
index 5: (data 5, parent 1)
index 6: (data 6, parent 5)
index 7: (data 7, parent 5)
index 8: (data 8, parent 7)
index 9: (data 9, parent -1) 输入一对数据,(0,0)表示结束:0,0
数据data:0在S集合中不存在! 现开始压缩路径, 输入要压缩的结点值: 8
打印以树的双亲表示法表示的树:
树的结点数: 9
树的根的位置: 0
index 0: (data , parent -1208980472)
index 1: (data 1, parent -8)
index 2: (data 2, parent 1)
index 3: (data 3, parent 1)
index 4: (data 4, parent 3)
index 5: (data 5, parent 1)
index 6: (data 6, parent 5)
index 7: (data 7, parent 1)
index 8: (data 8, parent 1)
index 9: (data 9, parent -1) Process finished with exit code 0

示意图中的例子的代码实现

2 回溯法与树的遍历

3 树的计数

树和二叉树->其他(待完善)的更多相关文章

  1. 树(二叉树 & 二叉搜索树 & 哈夫曼树 & 字典树)

    树:n(n>=0)个节点的有限集.有且只有一个root,子树的个数没有限制但互不相交.结点拥有的子树个数就是该结点的度(Degree).度为0的是叶结点,除根结点和叶结点,其他的是内部结点.结点 ...

  2. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  3. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  4. lintcode :前序遍历和中序遍历树构造二叉树

    解题 前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \ 1 3 注意 你可以假设树中不存 ...

  5. lintcode: 中序遍历和后序遍历树构造二叉树

    题目 中序遍历和后序遍历树构造二叉树 根据中序遍历和后序遍历树构造二叉树 样例 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1    3 注意 你可 ...

  6. XJOI1559树转二叉树

    树转二叉树 将一棵树转化成二叉树. 输入格式: 输入的信息,第一行一个数n,(n<=1000)是树的结点数,以下n行,第i+1行是第i个结点的信息,第一个整数,是该结点的特征数值,后列出所有孩子 ...

  7. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  8. python数据结构之树和二叉树(先序遍历、中序遍历和后序遍历)

    python数据结构之树和二叉树(先序遍历.中序遍历和后序遍历) 树 树是\(n\)(\(n\ge 0\))个结点的有限集.在任意一棵非空树中,有且只有一个根结点. 二叉树是有限个元素的集合,该集合或 ...

  9. 数据结构与算法(C/C++版)【树与二叉树】

    第六章<树与二叉树> 树结构是一种非线性存储结构,存储的是具有"一对多"关系的数据元素的集合. 结点: A.B.C等,结点不仅包含数据元素,而且包含指向子树的分支.例如 ...

随机推荐

  1. 阅读《深入应用C++11:代码优化与工程级应用》

    虽然一直是写C++的,但是却对C++11了解的不是太多,于是从图书馆借了本书来看 这本书分两大部分: 一.C++11的新特性讲解 二.工程级代码中C++11的应用 这样的安排很合理,第一部分把新特性讲 ...

  2. 【Ubuntu】PHP环境安装-phpstudy for linux版

    安装: wget -c http://lamp.phpstudy.net/phpstudy.bin chmod +x phpstudy.bin    #权限设置sudo ./phpstudy.bin ...

  3. iOS开发:一个无限滚动自动播放图片的Demo(Swift语言编码)

    很久以前就想写这么一个无限滚动的Demo了,最近学习了下Swift,手中没有可以用来练手的Demo,所以才将它实现了. Github地址(由于使用了UIView+AutoLayout第三方进行布局,所 ...

  4. Guava Lists.transform踩坑小记<转>

    1.问题提出 1.前段时间在项目中用到Lists.transform返回的List,在对该list修改后发现修改并没有反映在结果里,研究源码后发现问题还挺大.下面通过单步调试的结果来查看Guava L ...

  5. 阿里巴巴面试之利用两个int值实现读写锁

    首先我们对读写锁做一个概述: 假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁.在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资 ...

  6. .NET DLL 加密工具

    最近发现了一个软件叫 DotfuscatorPro 混淆加密工具 设置方式如下 1. Settings->Global Options Disable String Encryption 设为  ...

  7. ESN,MEID 和pESN

    ESN (Electronic Serial Numbers):电子序列号.在CDMA 系统中,是鉴别一个物理硬件设备唯一的标识.也就是说每个手机都用这个唯一的ID来鉴别自己, 就跟人的身份证一样.一 ...

  8. (实用)CentOS 6.3更新内置Python2.6

    在安装Kilo版的OpenStack时,我们发现社区已经将Python升到2.7,而CentOS 6.3上仍然在使用2.6版的Python.本文记录将CentOS 6.3内置的Python2.6更新为 ...

  9. CentOS6.x 升级到 CentOS7.x(测试)

    博文来源:http://leyewen.blog.163.com/   官方升级教程:http://wiki.centos.org/TipsAndTricks/CentOSUpgradeTool   ...

  10. 分辨率,PPi,DPI,DPR,物理像素,逻辑像素

    屏幕尺寸:指的是屏幕对角线的长度 分辨率:是指宽度上和高度上最多能显示的物理像素点个数 点距:像素与像素之间的距离,点距和屏幕尺寸决定了分辨率大小 PPI:屏幕像素密度,即每英寸(1英寸=2.54厘米 ...