当前课程知识点:数据结构(上) > 第五章 二叉树 > (b)树的表示 > 05B-5 长子+兄弟
反观刚才所出现的问题
根源在于每一个节点的出度
是不尽相同的
有的是3
有的是2
而更多的呢
是0
为进行改进
我们必须发现
每个节点所具有的某种不变性
我们会发现就向下的引用而言
每一个节点只需记两个信息就够了
第一个就是它的长子
第二个呢
就是每一个节点的下一个兄弟
作为多为独生子女的年轻人
这样一个方式可能不太好理解
对于稍早一些兄弟姐妹较多的家庭
那么这个策略就非常自然而然了
在一个家庭中 如果孩子相对更多
那么很多家庭
所普遍采用的一种策略就是
父母将主要的事情交办给长子
而其它的孩子呢
则是在大哥的带领下 依次地彼此照顾
也就是说 父母更多的
首先关注的是长子
的确 从简洁性来讲
这的确是一个非常好的方法
也是我们在这里需要借鉴的
我们来看这里的一个实例
对于任何一个节点
我们都只关心它的长子
比如相对于R而言 就是A
我们不再像以前那样
保留通往所有孩子的引用
而只是保留从R到长子的一个引用
也就是我们说的firstChild()
而R节点的其它的孩子呢?
在这里的讲B和C呢?
会依次地通过nextSibling()这个引用
由A指向B
再由B通过下一个
它的nextSibling()指针指向C
采用这种方法
我们依然可以确认
并且保持不同节点之间的代继关系
也就是沿着纵向不断地向下
代次逐渐地下降
越往上是越高的祖先
而nextSibling()这个引用呢
我们可以按照这里的图示
将它们理解为在同辈的
兄弟之间的水平方向的引用
请注意
相对于此前常规的表示方法
这种表示方法的规整性非常的突出
我们再来看一下 对于任何一个节点
无论是A B C或者是D E F
它都只需简明地记录两个引用就够了
也就是纵向的firstChild()
以及横向的nextSibling()
也就是说
每个节点所需要占用的空间
依然是常数
而且都彼此接近
这是此前的常规方法所无法比拟的
这种所谓的长子兄弟法
不仅是树的一种很好的表示方法
而且也是对树的本质的
一种更深刻的理解
在此后我们介绍二叉树
并且用二叉树来代表所有的树的时候
我们将再次用到这样一种表示方法
在后面 我们会看到
对于树这样的一个全集来说
尽管二叉树只是它的一个特殊的子集
但是很有趣的是
在施加了某些条件之后
二叉树却足以来表示和实现所有的树
而这样一种方法背后的原理
在很大程度上
就是基于我们这里所介绍的
长子兄弟法
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)计算
--演示
--(a)计算--作业
-(b)计算模型
-(b)计算模型--作业
-(c)大O记号
-(c)大O记号--作业
-(d)算法分析
-(d)算法分析--作业
-(e)迭代与递归
-(e)迭代与递归--作业
-(xc)动态规划
-- 演示
-(xc)动态规划--作业
-本章测验--作业
-(a)接口与实现
--02A-5 复制
-(a)接口与实现--作业
-(b)可扩充向量
-(b)可扩充向量--作业
-(c)无序向量
--02C-1 概述
--02C-3 插入
--02C-6 查找
--02C-8 遍历
-(c)无序向量--作业
-(d1)有序向量:唯一化
-(d1)有序向量:唯一化--作业
-(d2)有序向量:二分查找
-(d2)有序向量:二分查找--作业
-(d3)有序向量:Fibonacci查找
-(d3)有序向量:Fibonacci查找--作业
-(d4)有序向量:二分查找(改进)
-(d4)有序向量:二分查找(改进)--作业
-(d5)有序向量:插值查找
-第二章 向量(下)--(d5)有序向量:插值查找
-(e)起泡排序
--02E-2 改进
--02E-3 反例
-(e)起泡排序--作业
-(f)归并排序
-(f)归并排序--作业
-本章测验--作业
-(a)接口与实现
--03A-4 实现
-(a)接口与实现--作业
-(b)无序列表
--03B-2 查找
-(b)无序列表--作业
-(c)有序列表
--03C-3 查找
-(c)有序列表--作业
-(d)选择排序
--03D-1 构思
--03D-2 实例
--03D-3 实现
--03D-4 推敲
--03D-6 性能
-(d)选择排序--作业
-(e)插入排序
--03E-1 经验
--03E-2 构思
--03E-3 对比
--03E-4 实例
--03E-5 实现
-(e)插入排序--作业
-(xd)习题辅导:LightHouse
-本章测验--作业
- (a)栈接口与实现
--04A-1 栈
--04A-2 实例
--04A-3 实现
- (a)栈接口与实现--作业
-(c1)栈应用:进制转换
-第四章 栈与队列--(c1)栈应用:进制转换
-(c2)栈应用:括号匹配
-(c2)栈应用:括号匹配--作业
-(c3)栈应用:栈混洗
-第四章 栈与队列--(c3)栈应用:栈混洗
-(c4)栈应用:中缀表达式求值
-(c4)栈应用:中缀表达式求值--作业
-(c5)栈应用:逆波兰表达式
-第四章 栈与队列--(c5)栈应用:逆波兰表达式
-(d)队列接口与实现
--04D-1 接口
--04D-2 实例
--04D-3 实现
-第四章 栈与队列--本章测验
-(a)树
--05A-1 动机
--05A-2 应用
-(a)树--作业
-(b)树的表示
--05B-2 父亲
--05B-3 孩子
-第五章 二叉树--(b)树的表示
-(c)二叉树
-(c)二叉树--作业
-(d)二叉树实现
-(d)二叉树实现--作业
-(e1)先序遍历
-(e1)先序遍历--作业
-(e2)中序遍历
-第五章 二叉树--(e2)中序遍历
-(e4)层次遍历
-第五章 二叉树--(e4)层次遍历
-(e5)重构
-(e5)重构--作业
-本章测验--作业
-(a)概述
-(a)概述--作业
-(b1)邻接矩阵
-(b1)邻接矩阵--作业
-(c)广度优先搜索
--06C-2 策略
--06C-3 实现
--06C-5 实例
-(c)广度优先搜索--作业
-(d)深度优先搜索
--06D-1 算法
--06D-2 框架
--06D-3 细节
-(d)深度优先搜索--作业
-第六章 图--本章测验