数据结构快速回顾——二叉树 解幂子集问题

回溯法是设计递归的一种常用方法,它的求解过程实质上就是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的而是隐含在遍历过程中的。

下面举一个例子:求含n个元素的集的幂集:
集合A={ {1,2,3}, {1,2}, {1,3}, {1}, {2,3},{2},{3},{}}; //{}表示空集合
从集合A的每一个元素的角度看,它只有两种状态:或者是属于幂集的元素集,或不属于幂集元素集,则求幂集的过程就可以看成是依次对集合A中的元素进行"取","舍"的过程,并且可以用二叉树来表示过程中幂集的变化状态。

解题思路:求幂集的过程可看成是依次对集合A中的元素进行取或舍的过程。
1.选择合适的数据结构——假设以线性表表示集合。
2.树根结点表示幂集元素的初始状态(空集),叶子结点表示终结状态(幂集的元素),第i层表示已对前i-1个元素进行了取舍的当前状态
下面是代码:

 1 #include <iostream>
 2 #include <list>
 3
 4 using namespace std;
 5
 6 // 输出集合元素
 7 void printSet(list<int> p)
 8 {
 9     size_t num = p.size();
10     if(!num)
11         cout<<"空集\n";
12     else
13     {
14         list<int>::iterator pos = p.begin();
15         for( ;pos!= p.end() ; pos++)
16         {
17             cout<<(*pos)<<"\t";
18         }
19         cout<<"\n"<<endl;
20     }
21 }
22
23 //求包含n个元素的集合a 的幂集
24 //a是原始集合 b是集合a的幂集中某个集合
25 //假设集合A中前i-1个元素已经决定了取舍
26 //现在对第i个元素进行取舍处理;如果i>n 说明已经完成的最后元素的选择,输出
27 void GetPowerSet(int i,list<int> a,list<int> &b)
28 {
29     int n = a.size();
30     if(i >= n)
31         printSet(b);
32     else
33     {
34         list<int>::iterator it = a.begin();
35         int j = 0;
36         while(j++ < i)
37             it++;
38         int tmp = *it;
39         b.push_back(tmp);
40         GetPowerSet(i+1,a,b);
41         b.pop_back();
42         GetPowerSet(i+1,a,b);
43     }
44 }
45
46 int main(int argc,char* argv[])
47 {
48     list<int> la,lb;
49     la.push_back(10);
50     la.push_back(3);
51
52     GetPowerSet(0,la,lb);
53     return 0;
54 }

数据结构快速回顾——二叉树 解幂子集问题,布布扣,bubuko.com

时间: 2024-07-31 14:35:23

数据结构快速回顾——二叉树 解幂子集问题的相关文章

数据结构快速回顾——二叉树

二叉树(Binary Tree)是个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成.当集合为空时,称该二叉树为空二叉树.在二叉树中,一个元素也称作一个结点. 基本概念: (1)结点的度.结点所拥有的子树的个数称为该结点的度. (2)叶结点.度为0的结点称为叶结点,或者称为终端结点. (3)分枝结点.度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结点除叶结点外,其余的都是分支结点. (4)左孩子.右孩子.双亲.树中一

数据结构快速回顾——平衡二叉树 AVL (转)

平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树.1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树.平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态.这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(

数据结构快速回顾——二叉查找树

二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树: 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: 任意节点的左.右子树也分别为二叉查找树. 没有键值相等的节点(no duplicate nodes). 二叉查找树相比于其他数据结构的优势在于查找.插入的时间复

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已

数据结构快速回顾——栈

堆栈,也可直接称栈,是一种特殊的串行形式的数据结构,它的特殊之处在于只能允许在链结串行或阵列的一端进行加入资料和输出资料的运算.另外堆栈也可以用一维阵列或连结串行的形式来完成. 1 #define STACK_INIT_SIZE 100 2 #define STACKINCREMENT 10 3 4 typedef struct 5 { int* top; 6 int* base; 7 int stacksize; 8 }SqStack; 9 10 int InitStack(SqStack &

数据结构快速回顾——开篇

六月到了.开始找工作的节奏,IT方面知识储备严重欠缺,定计划,更新博客,记录自己的准备历程. 1.数据结构 15天 2.常用算法(排序.动态规划.贪心等) 30天 3.数据挖掘算法 15天 4.移动端.web端开发入门 15天 5.操作系统 10天 共计85天,那时将近9月,还能赶上找工作的大潮. 何为数据结构?数据结构用处?一般来说,使用计算机解决一个问题的时候需要经历以下步骤:分析问题.抽象出数学模型.设计解数学模型的算法.写程序.测试.得到最终结果.为了解决非数值型数学模型,需要使用诸如表

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树.下图中展现了五种不同基本形态的二叉树. 其中 (a) 为空树, (b

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu