zoukankan      html  css  js  c++  java
  • 树形dp技巧,多叉树转二叉树

    今天复习树形dp时发现一道比较古老的题,叫选课,是树形dp的一道基础题,也是多叉树转二叉树应用的模版题

    多叉树转二叉树的应用非常广泛,因为如果一个节点的儿子太多,一个一个存下来不方便去查询,并且会增加复杂度,但是这里我们就有一个O(n)的复杂度的方法把多叉树转换为二叉树,转换成二叉树后就更方便查询,因为每个节点最多就两个儿子节点,减少了复杂度并且让代码实现起来更容易

    多叉树转二叉树图示:

    在这张图中,右边那棵二叉树由左边的多叉树转换而来,并且这棵二叉树是竖着相连的是父子关系,横着相连的是兄弟关系,也就是左儿子,右兄弟

    接着就是代码实现了,其实代码实现也有一些小小的技巧

    比如我们要求输入a,b表示a是b的儿子

    例子: 2 1 

               4 1

               3 1

    如果我们按着顺序处理,那1的左儿子就是2,2的右儿子是4,4的右儿子是3,但是这样的话会有一点的麻烦,所以我们就不断的变更

    方法:1的左儿子是2,读入第二行,4的右儿子就是当前1的左儿子节点2,然后1的左儿子变成4,读入第三行,3的右儿子是节点4,然后1的左儿子变成3

    这种方法在代码上更加容易实现并且复杂度也要小一些

    转换成代码就是

    1 for(int i=1;i<=n;i++)
    2 {
    3      cin>>a>>b;
    4      tree[a].right=tree[b].left;
    5      tree[b].left=a;
    6 }
    View Code

    代码就是这样,然后推荐一道模拟题,叫做选课,不过我还不知道出处,但是后面我会把这道题补到我的博客

  • 相关阅读:
    [转载]tlb、tlh和tli文件的关系
    [转载]美国不是中国唯一的榜样
    使用spring.net 1.3.2框架部署在虚拟目录上发生错误
    用Log4Net记录NHibernate中执行的SQL语句及执行时间
    IIS7/8 HTTP Error 500.19 错误 0x80070021
    IE下点击scrollbar会导致焦点移动到body
    性能测试学习(一)--基础知识点
    测试基础知识点汇总
    如何制定测试计划
    《软件测试经验与教训》摘录
  • 原文地址:https://www.cnblogs.com/Danzel-Aria233/p/7462403.html
Copyright © 2011-2022 走看看