知否知否,如何用树保存家谱

题图.jpg

《知否知否,应是绿肥红瘦》电视里的人物实在太多,像我这种跳集、前后穿插看的,一不当心,就把“老子当成儿子”了,一时好奇,试想如何用数据结构来表示这样复杂的人物关系,先来看看盛老爷一家子:


盛府

看到这样的树状结构,很自然的想到用树来存储,每个结点用个对象来存储:


固定孩子的树

由于不可能为每个结点单独设计一个对象(即使设计了编程处理也十分繁琐),于是用来存储孩子的空间是用盛弘或王氏的孩子数来分配的,因为他们的孩子数最大(三个),可是如果哪个子女生了四个孩子,就得扩展每个结点的孩子数,显然这种固定分配的方式无法满足家族扩展的需要,也造成了空间的浪费,见上图中标记的“空”。
其实可以用最简单的二叉树巧妙地处理任意孩子的情况,只需要定义两个规则:

  1. 左指针指向第一个孩子。
  2. 右指针指向兄弟姐妹。


    二叉树存储

如图,实际上兄弟就类似用链表来存储,就不再受数量的限制了。
由于我们转换了思想,就可以用二叉树及两个简单的规则来表示复杂的现实关系,所以

你可以通过简单事情的互动来建立任何程度的复杂任务。
——Unix设计思想

这也正是软件开发真正迷人之处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • B树的定义 一棵m阶的B树满足下列条件: 树中每个结点至多有m个孩子。 除根结点和叶子结点外,其它每个结点至少有m...
    文档随手记阅读 14,569评论 0 25
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,342评论 0 13
  • 目录 1、什么是树 2、相关术语 3、二叉树 3.1、二叉树的类型 3.2、二叉树的性质 3.3、二叉树的结构 3...
    我哈啊哈啊哈阅读 7,382评论 0 10
  • 1.树和二叉树的定义 (1) 树的定义 树是n (n≥0) 个结点的有限集。 n=0 时称为空树。在任意一棵非空树...
    yinxmm阅读 7,146评论 0 3
  • 明月几时有,把酒问青天。 小时候对于中秋的记忆是一串酸甜的葡萄。一家人其乐融融,伙伴们欢呼雀跃。童年的回忆总是很美...
    风逐自由路和远方阅读 1,436评论 0 0