一般来说,大学开设的数据结构的课程更偏向于理论,对于具体问题的解决方法需要同学自己去练习掌握。
前几天,山东科技大学的一个高中同学需要做设计,这个设计不是一般意义上的小项目而是一个编程练习,但是需要答辩。问题还是那个很经典的问题–家谱。
设计一个家谱最核心的问题就是家谱的数据结构,毫无疑问,一定是采用树状结构。但是,如果某一个男子有三四个孩子那么这个节点就要有三四个子节点。从解答问题的角度来说,如果每一个节点最多有两个子节点我们才认为这是较好的结构。
于是问题来了:每个节点最多两个子节点,那么如果一个老人有五个孩子,那么该如何表示?
首先我们来了解一下二叉树的分支:二叉树的每个节点的两个分支指向了两个子节点,其实这两个分支的意义并不只是这样,两个分支不但可以代表两个数据,还可以代表两种数据。
举个例子:假设这个家族严格响应国家计划生育的基本国策,每个父亲最多两个孩子,那么每个父节点的两个分支就可以指向他的两个孩子。在这个例子中,两个分支都是指向了父亲的孩子,所以这两个分支表示的是两个不同的数据。如果某一个父亲有了三个孩子,就代表实际情况中出现了一个父节点有三个不同的孩子,很显然这种表示方式不能表示有两个以上孩子的家庭情况。
所以为了能准确地利用二叉树表示多个孩子,采用“兄弟二叉树”来实现。具体实现方法如下。:
每一个节点表示一个家族成员,节点A的两个子节点B和C中,B表示A节点的长子,C表示A节点的年龄最大的弟弟。
当一个父亲有五个儿子的时候,父亲的B节点指向了他的长子,长子的C节点指向次子,次子的C节点指向犬子以此类推。