`
forestking
  • 浏览: 43931 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Full Binary Tree

阅读更多

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的方法也要复杂一些,相当于要构建一棵树。看了题目自己的分析后改成了现在这样。

 

分享到:
评论

相关推荐

    二叉树详解 binary tree

    - **满二叉树**(Full Binary Tree): 每个节点要么有两个子节点,要么没有子节点。 - **平衡二叉树**(Balanced Binary Tree): 任意两个叶子节点之间的深度差不大于1。 - **二叉搜索树**(Binary Search Tree): 对于...

    C++binary tree

    - **满二叉树(Full Binary Tree)**:所有节点要么是叶子节点,要么有两个子节点。 - **完全二叉树(Complete Binary Tree)**:除了最后一层外,其余层都是满的,最后一层的节点都尽可能地靠左排列。 - **平衡...

    数据结构教学课件:chapter5 A Binary Tree Node ADT.ppt

    满二叉树(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 tree_full

    【标题】"BinaryTree_full_comlete_code.zip" 是一个包含C++Builder编写的二叉树完整代码的压缩包,重点在于实现"full"和"complete"两种类型的二叉树。"C++Builder"是一个集成开发环境,主要用于创建C++应用程序,它...

    Javatree java树结构

    - 满二叉树(Full Binary Tree):每个节点要么有两个子节点,要么没有子节点,即没有只有一个子节点的情况。 - 平衡二叉树(Balanced Binary Tree):左右两个子树的高度差不超过1,并且每个节点都包含左子树和右...

    tree树形结构

    - **满二叉树(Full Binary Tree)**:除了叶子节点外,每个节点都有两个子节点。 - **完全二叉树(Complete Binary Tree)**:满二叉树的一种特殊情况,所有层级都是完全填充的,除了可能的最后一层,且最后一层...

    js tree.rar

    - **满二叉树(Full Binary Tree)**:除了叶子节点外,每个节点都有两个子节点。 - **平衡二叉树(Balanced Binary Tree)**:左右子树的高度差不超过1,如AVL树和红黑树。 4. **树的实现** - 在JavaScript中,...

    JAVA制作树TREE

    - **满二叉树(Full Binary Tree)**: 所有节点要么有两个子节点,要么没有子节点,即不存在只有一个子节点的情况。 - **平衡二叉树(Balanced Binary Tree)**: 左右子树的高度差不超过1,如AVL树和红黑树。 - *...

    BinaryTree:编写家庭作业#1

    在这个名为"BinaryTree:编写家庭作业#1"的任务中,我们很可能是要实现一系列与二叉树相关的操作,比如创建、插入、查找、删除等。由于标签指定为"C++",我们可以期待使用C++语言来完成这些操作。 首先,我们需要...

    tree实现

    - 满二叉树(Full Binary Tree):除了叶子节点外,每个节点都有两个子节点。 - 堆(Heap):一种特殊的二叉树,如最大堆和最小堆,满足特定条件,常用于优先队列。 - 平衡树(Balanced Tree):为了保证操作效率...

    不同种类的tree,附源码

    满二叉树(Full Binary Tree),每个节点要么没有子节点,要么有两个子节点。 2. **平衡树** (Balanced Tree):为了解决二叉搜索树在最坏情况下的性能问题,我们引入了平衡树,例如AVL树和红黑树。AVL树是第一个自...

    数据结构 二叉树及遍历 PPT

    * 满二叉树(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. **图**...

    数据结构二叉树实验报告.doc

    * 满二叉树(Full Binary Tree):每个节点最多有两个孩子节点,且所有叶子节点的深度相同的树。 * 完全二叉树(Complete Binary Tree):每个节点最多有两个孩子节点,且所有叶子节点的深度相同,且最后一层叶子...

    计算机IT英语专业词汇.pdf

    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 ...

    实现二叉树各种基本运算源程序.docx

    - **满二叉树**(Full Binary Tree): 每个节点都有两个子节点或者没有子节点。 - **完全二叉树**(Complete Binary Tree): 除了最后一层外,每一层都是满的;最后一层的节点都集中在左边。 - **平衡二叉树**(Balanced ...

    java---数据结构

    二叉树(Binary Tree)是每个节点最多有两个子节点的树形结构,分为二叉搜索树(Binary Search Tree)、完全二叉树(Complete Binary Tree)和满二叉树(Full Binary Tree)等。其中,二叉搜索树具有左小右大的特性...

Global site tag (gtag.js) - Google Analytics