当前课程知识点:数据结构(上) > 第五章 二叉树 > (c)二叉树 > 05C-3 描述多叉树
好
接下来我们来介绍
这一节最重要的一点
如何通过二叉树来描述多叉树
也就是一般意义上的树
表面上看 这是不可能的
因为你似乎是在用一种特例
来描述所有的情况
然而很有意思的是 这竟然是事实
这就犹如你可以严格的证明
在0和1之间的实数
与整个实轴上的实数
同样多一样
这里并非没有条件
当然条件也不多
就两条
我们此前所介绍的
有根以及有序
换而言之
凡是有根且有序的树
都可以通过二叉树描述表示
并进而实现
为此我们需要回忆此前
刚刚介绍的长子兄弟表示法
这个方法可以用这样两幅图来示意
我们说在原来一般性的树的表示中
每一个节点的出度不同
它所对应的出边
也就需要相应的记录
这种方法我们分析过
它规整性非常差
那么长子兄弟法呢
它只要求每一个节点
记录两个引用就够了
首先一个是相对于它而言的
所有孩子中的最大者
也就是firstChild() 长子
另一个呢 是相对于
当前这个节点而言的下一个兄弟
也是一个引用
我们曾经介绍过
为了便于理解
我们应该将所有的firstchild()
也就是一代与下一代之间的
所有的引用画为垂直方向的
这样通过高度
就可以区分代继或者叫辈分
而同一代的nextSibling这种引用呢
我们建议大家画成水平的
表示它们虽然有长幼之分
但是从辈分上来讲 都是相同的
它们互为兄弟
那我要指出的是
如果你已经懂得了长子兄弟法
那么再进一步地将这种表示法
转化为二叉树表示法就只差一步
甚至说半步之遥
哪半步呢?
我们只需要将每一个节点
所对应的那样一个局部
也就是firstChild()
和nextSibling()这样一个结构
做一个45度角的旋转
使之变为这样一个形式
firstChild()和nextSibling()
你看到什么了?
没错 这就是一个二叉树的局部
我们如果将这样一个原则
施加到长子兄弟表示法中的
任何一个局部
就可以总体上将原来那样一个表示法
转化为我们这里以左右相别的
二叉树表示法
仍然以我们这里的树为例
再将原来这样一棵一般性的
有根有序树
转化为长子兄弟表示法之后
只需对它的任何局部
实施这样的一个45度的旋转
就可以将它转化为
最右侧这样一个形式
我们可以看到
它们之间是完全对应的
比如说 根节点
再比如说 根节点通往
它的第一个孩子的这条边
这条边经过旋转以后
将会成为这个节点
通往它的左孩子的那条边
再如A这个节点
它的下一个兄弟是B
而在这棵树中呢
A节点将以B作为它的右孩子
其它的位置也是如此
大家不妨在课后逐一地校验
总而言之 通过这样的一个局部的变换
我们就可以将任何一棵一般性的树
转化为它的长子兄弟表示法
并且进一步地转化
并理解为是一棵二叉树
由此可见
如果说我们这一章的任务
是描述并且实现以及利用树结构的话
不如说我们只需研究并且实现二叉树
也正是因为这样的一个原因
尽管后者只是前者的一个特例
我们依然将后者 也就是二叉树
作为我们这一章的标题
这也是为什么
你在第一节会看到一个有趣的现象
树反而会成为那样一个小节的标题
好了
二叉树结构的实现和相关的算法
又是如何的呢?
这正是我们接下来几节
将要陆续讨论的
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验