https://code.google.com/codejam/contest/2984486/dashboard#s=p1&a=1
题目可以归纳为以下几点:
1. 给定一棵树,节点从1到N标记,用连接节点的无向边(N - 1条)定义, 比如:
3 2 1 1 3
2. 判断这棵树是否是Full Binary Tree, (除了叶节点,其他的节点必须有两个子节点);
3. 如果不是,需要删除多少个节点(删除节点,以此节点为端点的边也会被删除),可以得到一颗FBT。求最少需要删除几个节点。
我自己可以想到的一个比较直观的想法,就是判断现在剩下的节点是否可以组成一颗FBT,如果可以,那么到目前为止删除的就是答案;如果不可以,从这些剩下的节点里再删除一个节点,递归判断,并取最小的结果;经过一点优化,可以解决small practice;这个算法也就是题目分析里面提到的Brute Forcehttps://code.google.com/codejam/contest/2984486/dashboard#s=a&a=1
下面是这个算法的实现:
import scala.io.Source object FullBinaryTree extends App { val file = "src/scala/codejam/year2014/round/a/B-small-practice.in" val lines = Source.fromFile(file).getLines() val T = lines.next().toInt def process(t: Int): Unit = if (t <= T) { val n = lines.next().toInt val nodes = (1 to n).foldLeft(Nil: List[Int])((l, x) => x :: l) def readEdges(i: Int, edges: List[Edge]): List[Edge] = if (i >= n) edges else { val line = lines.next().split("\\s+").map(_.toInt) val x = line(0) val y = line(1) readEdges(i + 1, Edge(x, y) :: edges) } val edges = readEdges(1, Nil) var cache = Map.empty[String, Int] def check(nodes: List[Int], edges: List[Edge], removed: Int): Int = { val key = nodes.sorted.mkString("") if (cache.contains(key)) { cache(key) } else { val g = new G(nodes, edges) val result = if (g.isBalance) removed else { nodes.foldLeft(Integer.MAX_VALUE)((x, n) => { val y = check(nodes.filter(_ != n), edges.filterNot(e => e.v == n || e.w == n), removed + 1) if (x > y) y else x }) } cache += (key -> result) result } } val removed = check(nodes, edges, 0) println(s"Case #$t: $removed") process(t + 1) } process(1) } case class Edge(v: Int, w: Int) { def other(x: Int) = if (x == v) w else if (x == w) v else throw new Error(s"$x is not a end of this edge") } class G(nodes: List[Int], edges: List[Edge]) { lazy val degree = nodes.foldLeft(Map.empty[Int, Int])((map, x) => map + (x -> edges.filter(e => e.v == x || e.w == x).size)) def isBalance = if (nodes.size == 1) true else { val root = degree.filter(x => x._2 == 2) edges.size == nodes.size - 1 && root.size == 1 && degree.filter(_ != root.head).forall(x => x._2 == 1 || x._2 == 3) } }
那个cache的使用是程序performance的一个关键,否则程序对于某个node list重复计算很多次;
我一开始判断isBalance的方法也要复杂一些,相当于要构建一棵树。看了题目自己的分析后改成了现在这样。
相关推荐
- **满二叉树**(Full Binary Tree): 每个节点要么有两个子节点,要么没有子节点。 - **平衡二叉树**(Balanced Binary Tree): 任意两个叶子节点之间的深度差不大于1。 - **二叉搜索树**(Binary Search Tree): 对于...
- **满二叉树(Full Binary Tree)**:所有节点要么是叶子节点,要么有两个子节点。 - **完全二叉树(Complete Binary Tree)**:除了最后一层外,其余层都是满的,最后一层的节点都尽可能地靠左排列。 - **平衡...
满二叉树(Full Binary Tree)是指每个节点要么是叶节点,要么是拥有两个非空子节点的内部节点。这样的树每个节点都正好有两个子节点。而完全二叉树(Complete Binary Tree)在高度为d的树中,除了可能的第d-1层外,...
实现哈夫曼算法的前提是要考虑用什么样的存储结构来存储一棵哈夫曼树。在哈夫曼树中,没有度为1的结点,结点总数是n0+n2(其中n0表示二叉树中度为0的结点数,n2表示度为2的结点数),而由二叉树的性质知道n0=n2+1,...
【标题】"BinaryTree_full_comlete_code.zip" 是一个包含C++Builder编写的二叉树完整代码的压缩包,重点在于实现"full"和"complete"两种类型的二叉树。"C++Builder"是一个集成开发环境,主要用于创建C++应用程序,它...
- 满二叉树(Full Binary Tree):每个节点要么有两个子节点,要么没有子节点,即没有只有一个子节点的情况。 - 平衡二叉树(Balanced Binary Tree):左右两个子树的高度差不超过1,并且每个节点都包含左子树和右...
- **满二叉树(Full Binary Tree)**:除了叶子节点外,每个节点都有两个子节点。 - **完全二叉树(Complete Binary Tree)**:满二叉树的一种特殊情况,所有层级都是完全填充的,除了可能的最后一层,且最后一层...
- **满二叉树(Full Binary Tree)**:除了叶子节点外,每个节点都有两个子节点。 - **平衡二叉树(Balanced Binary Tree)**:左右子树的高度差不超过1,如AVL树和红黑树。 4. **树的实现** - 在JavaScript中,...
- **满二叉树(Full Binary Tree)**: 所有节点要么有两个子节点,要么没有子节点,即不存在只有一个子节点的情况。 - **平衡二叉树(Balanced Binary Tree)**: 左右子树的高度差不超过1,如AVL树和红黑树。 - *...
在这个名为"BinaryTree:编写家庭作业#1"的任务中,我们很可能是要实现一系列与二叉树相关的操作,比如创建、插入、查找、删除等。由于标签指定为"C++",我们可以期待使用C++语言来完成这些操作。 首先,我们需要...
- 满二叉树(Full Binary Tree):除了叶子节点外,每个节点都有两个子节点。 - 堆(Heap):一种特殊的二叉树,如最大堆和最小堆,满足特定条件,常用于优先队列。 - 平衡树(Balanced Tree):为了保证操作效率...
满二叉树(Full Binary Tree),每个节点要么没有子节点,要么有两个子节点。 2. **平衡树** (Balanced Tree):为了解决二叉搜索树在最坏情况下的性能问题,我们引入了平衡树,例如AVL树和红黑树。AVL树是第一个自...
* 满二叉树(full binary tree):一个二叉树拥有刚好 2的d次方 – 1 个节点,其中 d 是二叉树的深度。 * 完整二叉树(complete binary tree):一个二叉树拥有 n 个节点且深度为 d,且其节点对应深度为 k 的完整...
5. **树**:树形结构模拟了自然界中的层次关系,如二叉树(binary tree)、满二叉树(full binary tree)、完全二叉树(complete binary tree)和平衡二叉树(balanced binary tree,如AVL树和红黑树)。 6. **图**...
* 满二叉树(Full Binary Tree):每个节点最多有两个孩子节点,且所有叶子节点的深度相同的树。 * 完全二叉树(Complete Binary Tree):每个节点最多有两个孩子节点,且所有叶子节点的深度相同,且最后一层叶子...
3. 满二叉树(Full Binary Tree):一种二叉树,每个节点都有两个子节点。 4. 完全二叉树(Complete Binary Tree):一种二叉树,每个节点的左右子树高度相同。 六、图 1. 有向图(Directed Graph):一种图,每条...
- 满二叉树(Full Binary Tree):每个节点要么没有子节点,要么有两个子节点。 - 平衡二叉树(Balanced Binary Tree):左右子树的高度差不超过1,如AVL树和红黑树。 2. 森林(Forest):由多个互不相交的树组成...
Full binary tree: Each node is either a leaf or internal node with exactly two non-empty children. Complete binary tree: If the height of the tree is d, then all levels except possibly level d-1 are ...
- **满二叉树**(Full Binary Tree): 每个节点都有两个子节点或者没有子节点。 - **完全二叉树**(Complete Binary Tree): 除了最后一层外,每一层都是满的;最后一层的节点都集中在左边。 - **平衡二叉树**(Balanced ...
二叉树(Binary Tree)是每个节点最多有两个子节点的树形结构,分为二叉搜索树(Binary Search Tree)、完全二叉树(Complete Binary Tree)和满二叉树(Full Binary Tree)等。其中,二叉搜索树具有左小右大的特性...