雁过无痕

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

 

思路:

    先画一棵完全二叉树, 为节省空间,采用数组来实现。对这棵二叉树,叶子用于存放数据,节点用于统计叶子信息。

通过下面的三种方法,进一步节省空间:

1   节点只记录左子树叶子信息,右子树叶子信息通过当前节点和父节点等节点的值计算得出。

     因而需要指定一个点,当作根节点的“父节点”,以便计算根节点右子树信息。

     可以将根节点从1开始编号,对节点i,左孩子编号为2*i,右孩子编号为2*i+1,并用编号0记录整根树所有叶子的信息。

2   对某些应用,叶子信息可以通过节点信息计算得出,因而不保存叶子信息,

3   完全二叉树,边界要求为2^k,为了表示[0, n)这n个点,需要将n增加到2^k,实际上,

    只要第n个叶子的父节点r存在就可以了,编号大于r的节点根本不会被访问到,因而没必要分配空间

 

 

 

 

点树的实现



作者: flyinghearts
出处: http://www.cnblogs.com/flyinghearts/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted on 2011-04-01 23:36 flyinghearts 阅读(1402) 评论(2)  编辑 收藏 引用 所属分类: 算法

评论

# re: 点树的简单实现(极省空间) 2011-04-04 10:34 ths
跟普通树状数组好像没有什么区别,除了不记录最深一层。
  回复  更多评论
  

# re: 点树的简单实现(极省空间) 2011-04-12 00:00 flyinghearts
@ths
树状数组也不记录最深一层。其本质也是二叉树。(见:http://www.cppblog.com/flyinghearts/archive/2011/04/11/143989.html

点树定位左右孩子和父节点比较方便,如果把统计信息从原来的左子树改为统计整个子树,就相当于一棵线段树了。



  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理