算法系列001---dfs|多叉|解空间树理解
1.研究范围
1)多叉树,图的遍历
2)回溯法的解空间树=多叉树的遍历
2.研究方法
我们现在研究的是多叉树的遍历,突然想到为什么不能直接用二叉树的遍历方法呢?我们抱着这个问题,先找到多叉树的结构不同于二叉树的地方,然后研究二叉树的遍历,找到其适用范围的限制和多叉树不能采用二叉树遍历的原因,并解决,最后就得到了我们的多叉树的遍历方法。
2.1 从二叉树和多叉树|图的结构来研究
1)二叉树
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
2)多叉树|图
class UndirectedGraphNode {
int label;
List<UndirectedGraphNode> neighbors;
UndirectedGraphNode(int x) { label = x; neighbors = new ArrayList<UndirectedGraphNode>(); }
};
3)不同点或不能直接用二叉树遍历的原因
二叉树的邻接点是确定的(或者说是可以直接点名点到的),而多叉树和图的邻接点是不确定的,我们不可能直接点名某节点君的第i个邻接点。
2.2二叉树遍历方法,适用范围,多叉树|图不能适用的原因
1)二叉树的先序递归遍历
public class Solution {
List<Integer> l = new ArrayList<Integer>();
public List<Integer> preorderTraversal(TreeNode root) {
if (root != null) {
l.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
}
return l;
}
}
2)从上面的遍历得知,它的递归遍历中,preorderTraversal(root.left)是直接点名去遍历的,然后结合二叉树和多叉树和图结构的不同点,得出多叉和图不能直接使用二叉遍历的原因,就是它们的邻接点不确定,不能直接点到自己邻接点的名字。当然,这可以应用到三叉,四叉。。,必然要给其邻接点起好名字,下面以四叉为例,
结构:
public class TreeNode {
int val;
TreeNode first;
TreeNode second;
TreeNode third;
TreeNode fouth;
TreeNode(int x) { val = x; }
}
遍历:
public class Solution {
List<Integer> l = new ArrayList<Integer>();
public List<Integer> preorderTraversal(TreeNode root) {
if (root != null) {
l.add(root.val);
preorderTraversal(root.first);
preorderTraversal(root.second);
preorderTraversal(root.third);
preorderTraversal(root.fouth);
}
return l;
}
}
所以,如果想要五叉,六叉都要给其邻接点起好名字,然后再列举出来分别遍历,呀,我们看出来了,这是在是很麻烦,也正是循环起源的原因,当邻接点可以起名字但很多,或者根本就不能起名字(当邻接点的个数不确定的时候)的时候,我们就不能采用二叉遍历的方法,我们要加入循环。当然,如果是图的话,我们还要加入visit[]数组,判断是否已经遍历过了。
2.3
1)不确定几叉的多叉的结构和遍历
import java.util.ArrayList;
import java.util.List;
class TreeNode{
int val;
List<TreeNode> neighbors;
TreeNode(int x) { val = x; neighbors = new ArrayList<TreeNode>(); }
}
public class b {
List<Integer> l = new ArrayList<Integer>();
public List<Integer> DFS(TreeNode root) {
if (root != null) {
l.add(root.val);
for(int i=0;i<root.neighbors.size();i++){
DFS(root.neighbors.get(i));
}
}
return l;
}
}
2)图的遍历
- 由于图的联通性未知,所以要对每个节点进行确认,循环遍历,如果没有visit过就要对其进行DFS;如果是连通的话,只需考虑下面一点即可。
- 由于图没有层次性特点,加入visit的hashMap结构
算法系列001---dfs|多叉|解空间树理解的更多相关文章
- POJ 3321 Apple Tree dfs+二叉索引树
题目:http://poj.org/problem?id=3321 动态更新某个元素,并且求和,显然是二叉索引树,但是节点的标号不连续,二叉索引树必须是连续的,所以需要转化成连续的,多叉树的形状已经建 ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- 聊聊算法——BFS和DFS
如果面试字节跳动和腾讯,上来就是先撕算法,阿里就是会突然给你电话,而且不太在意是周末还是深夜, 别问我怎么知道的,想确认的可以亲自去试试.说到算法,直接力扣hard三百题也是可以的,但似乎会比较伤脑, ...
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
- <转>从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转自 http://blog.csdn.net/likika2012/article/details/39619687 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经 ...
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
转载自:http://blog.csdn.net/v_july_v/article/details/8203674/ 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说: ...
- 玩转算法系列--图论精讲 面试升职必备(Java版)
第1章 和bobo老师一起,玩转图论算法欢迎大家来到我的新课程:<玩转图论算法>.在这个课程中,我们将一起完整学习图论领域的经典算法,培养大家的图论建模能力.通过这个课程的学习,你将能够真 ...
- 简答一波 HashMap 常见八股面试题 —— 算法系列(2)
请点赞,你的点赞对我意义重大,满足下我的虚荣心. Hi,我是小彭.本文已收录到 GitHub · Android-NoteBook 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注 ...
- 二叉索引树BIT
定义 二叉索引树,binary index tree,又名树状数组,或Fenwick Tree,因为本算法由Fenwick创造. 对于数组A,定义Query(i,j) = Ai +Ai ...
随机推荐
- 破解SharpPlus Sqlite Develope[转]
1.运行里输入regedit,打开注册表 2.编辑->查找,输入sqlite 查找结果如下 3.直接删除SqliteDev节点就可以了,重新打开Sqlite Developer就可以用了,当然还 ...
- Node.js学习 - Event Loop
Node.js本身是单线程,但通过事件和回调支持并发,所以性能非常高. Node.js的每一个API都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. 事件驱动程序 实例 var ev ...
- 转:【WebDriver】封装GET方法来解决页面跳转不稳定的问题
在大多数测试环境中,网络或者测试服务器主机之间并不是永远不出问题的,很多时候一个客户端的一个跳转的请求会因为不稳定的网络或者偶发的其它异常hang死在那里半天不动,直到人工干预动作的出现. ...
- C++:bitset类的使用
#include <iostream> #include <bitset> using namespace std; int main() { //初始化一个bitmap , ...
- VS2013编译FileZilla0.9.44
2014年,FileZilla更新了一下,到了44版本了,貌似也是用VS2013的工程做的项目,所以下载了server的安装包,然后安装SourceCode即可(需要安装InterFace,是安装必选 ...
- 最短路径算法专题3----Bellman-Ford
这个算法也是求单源最短路径用的,但是这个算法可以解决Dijkstra不能解决的负权边问题. 算法要点: 1.用dis存放源点到任意一点的距离. 2.用三个数组存放输入的点到点以及点到点的距离,x[i] ...
- Polygone对象
Polylgon对象是由一个或多个Ring对象的有序集合,它可以是由单个Ring 对象构成,也可以使用多个Ring组成.Polygon通常用来代表有面积的多边形矢量对象,如行政区,建筑物等. 组成Po ...
- C# 日期时间
//获取日期+时间 DateTime.Now.ToString(); // 2008-9-4 20:02:10 DateTime.Now.ToLocalTime().ToString(); // 20 ...
- Angular中ngModel的$render的详解
在我开始着手ngModel的领域时候,有一个问题很令我纠结,那就是$render()到底是做什么的呢?查了很多资料都只是简单的描述一下,这就令我很纠结了,终于在一个阳光明媚的晚上,我终于解决了这个大问 ...
- 1084:XX开公司<回溯>
Description 2020年,xx开了一家拥有N个员工的大公司.每天,xx都要分配N项工作给他的员工,但是,由于能力的不同,每个人对处理相同工作所需要的时间有快有慢.众所周知,xx是一个非常重视 ...