当前课程知识点:数据结构(上) > 第五章 二叉树 > (b)树的表示 > 05B-2 父亲
为此 你可能首先会想到
利用的一个事实就是
在任何一棵树中
除了根节点以外的任何一个节点
都有且仅有一个唯一的父节点
比如在这幅图中
我们可以确认任何一个节点
无论是A B C
还是D E F以及G H K
都有且仅有一个父节点
在这样的图中
我们只需将所有的边
都改为由节点向上指向它的父节点
就可以很清楚地看出这个规律
因此我们首先能够获得的一个构思就是
不妨将所有的节点
组织为一个序列就像这样
其中的每一个元素
都分别包括三项
data是节点本身的信息
rank或者position指明的是
这个节点的记录在这个序列中
所对应的秩或者是位置
而parent呢
恰好就是刚才我们所说的那个
任何一个节点唯一的父节点
当然是它所对应的秩或者是位置
比如在这个图中
节点E的父节点是A
所以在这种表示中
E节点的parent 指向的是1号
当然也就是A所在的那个元素
同样地 G H K
都是以F为父亲
这也是为什么它们的记录中
parents项都统一地设为6
而6是谁呢?
我们可以看到 恰好就是F
当然我们这里只有一个例外
也就是根节点本身
它按照定义是没有父节点
因此为了统一起见 这里用-1
也就是一个根本不可能存在的秩
来表示一个假想的父节点
这种表示方法似乎效果还不错
因为从空间上来看
在整个这个序列中
每一个节点只占用常数的空间
所以我们可以得出结论 这种表示法
如果能够兑现为一种数据结构的话
那么它的空间性能是O(n)
已经能做到最好了
嗯 还不错
而从时间角度来看
性能在有些接口方面也依然不错
比如说 对于任何一个节点
如果我们要去访问它的父节点的话
可以在O(1)的时间 就像这样
比如说D 可以在O(1)的时间内
确定是1号单元
并且随即转往并获取D的父节点
而访问树根节点呢
效率也不错
我们只需要从任何一个节点比如E出发
顺着parent引用不断地上行
迟早有一天会抵达不能前进的位置
而这个位置
就必然是我们所要找的根节点
整个这样的一个过程
充其量不过在最坏情况下
需要遍历所有的顶点
也就是说 在O(n)的时间内
我们就足以完成这件事
甚至我们还可以继续改进
也就是说 可以将根
固定的安置在秩为零的位置
也就是说 作为首元素
这样的话 对于root的访问
只需要常数的时间
然而不幸的是
如果我们要向下索取某个节点的后代
比如说它的第一个孩子 也就是长子
我们也依然需要去
遍历所有的元素
并且逐一地确认
它的父节点是否就是当前查询的元素
这样一个基本的操作
在最坏情况下
我们居然需要线性时间
而查找兄弟节点也是类似的
在最坏情况下 需要遍历整棵树
因此我们下一个改进 矛盾的焦点
也就自然地集中在
这样两种向下方向的查询上
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)深度优先搜索--作业
-第六章 图--本章测验