20172319 2018.10.19-10.26
《程序设计与数据结构》第6周学习总结
目录
教材学习内容总结
第十章 树
10.1 概述:html
- 树(tree) 是一种非线性 结构,其元素被组织成了一个层次 结构。
- 树 由一个包含结点 (node) 和边(edge) 的集构成,其中的元素被存储在这些结点中,边则将一个结点和另外一个结点链接起来。
- 每一结点都位于该树层次结构中的某一特定层上。
- 树的根(root) :即位于该树顶层 的惟一结点,一棵树只有一个根结点。
- 位于树中较低层的结点是上一层结点的孩子(children) , 同一双亲的两个结点称为兄弟(sibling) 。
- 没有任何孩子的结点称为叶子(leaf) , 一个至少有一个孩子的非根结点 称为一个内部结点(internal node) 。
- 若某一结点A从根 开始的路径中位于另外一结点B之上,则称A 为B的祖先(ancestor) , 根是树中全部结点的最终祖先。
- 沿着起始自某一特定结点的路径能够到达的结点是该结点的子孙(descendant) 。

- 结点的层 :从根结点 到该结点的路径长度。经过计算从根到该结点所必须越过的边数目,就能够肯定其路径长度(path length) 。
- 树的高度(height) :指从根到叶子之间最远路径的长度。

- 10.1.1 树的分类:
- 分类 方式有不少种:
- 最重要 的一条标准是树中任一结点能够具备的最大孩子数目。这一值有时候也称为该树的度 (order) 。
- 广义树(general tree) : 对结点所含有的孩子数目无限制 的树。
- n元树(n-ary tree) : 每一结点所含孩子数目不超过n。
- 二叉树(binary tree) : 结点最多具备两个孩子。
- 另外一种分类方式:
- 判断该树是否平衡;粗略地说,若是树的全部叶子都位于同一层或者至少是彼此相差不超过一层,就称之为是平衡的。
- 含有m个元素的平衡n元树具备的高度为lognm。 含有n个结点的平衡二叉树具备的高度为log2m。
- 彻底树(complete tree) : 若是一棵树是平衡的,且底层全部叶子都位于树的左边,则认为该树彻底。
- 彻底二叉树在每一个k层上都具备2k个结点,最后一层除外,在最后一层的结点必须是最左边结点。

满树(full tree) : n元树的全部叶子都位于同一层且每一个结点只有一片叶子或正好具备n个孩子。
node
- 10.2 实现树的策略
- 10.2.1 树的数组实现之计算策略:
- 对于任何存储在数组 位置n处的元素而言,该元素的左孩子 将存储在位置(2 x n +1) 处 ,该元素的右孩子则存储在位置(2 x (n + 1)) 处。
缺陷 : 浪费存储空间;其会为不彻底树的无元素位置分配多余的空间。
git
- 10.2.2 树的数组实现之模拟连接策略:
- 数组的每个元素都是一个结点类,每一结点存储的是每一孩子(可能还有其双亲)的数组索引,而不是做为指向其孩子(可能还有其双亲)指针的对象引用变量。
- 元素能连续存储在数组中,不会浪费存储空间。
- 增长了删除树中元素的成本,要么对剩余元素进行移位以维持连续状态,要么保留一个空闲列表。
该策略容许连续分配数组位置而不用考虑该树的完整性。算法

- 10.3 树的遍历

- 10.3.1 前序遍历(preorder traversal):
- 从根结点开始,访问每一结点及孩子。

- 10.3.2 中序遍历(inorder traversal):
从根结点开始,访问节点的左孩子,而后是该结点,再而后是剩余任何结点。
数组
- 10.3.3 后序遍历(postorder traversal):
从根结点开始,访问结点的孩子,而后是该结点。
数据结构
- 10.3.4 层序遍历(level-order traversal):
从根结点开始,访问每一层的全部结点,一次一层。
post
- 10.4 二叉树
- 二叉树的操做:
-
getRoot |
返回指向二叉树根的引用 |
isEmpty |
断定该树是否为空 |
size |
断定树中的元素数目 |
contains |
断定指定目标是否在树中 |
find |
若是找到指定元素,则返回指向其引用 |
toString |
返回树的字符串表示 |
iteratorInOrder |
为树的中序遍历返回一个迭代器 |
iteratorPreOrder |
为树的前序遍历返回一个迭代器 |
iteratorPostOrder |
为树的后序遍历返回一个迭代器 |
iteratorLevelOrder |
为树的层序遍历返回一个迭代器 |
返回目录学习
教材学习中的问题和解决过程
返回目录测试
代码调试中的问题和解决过程
问题1:如何删除某一指定结点的子树。.net
- 解决:
刚开始的代码是:
public LinkedBinaryTree removeRightsubtree(){
LinkedBinaryTree Rightsubtree = new LinkedBinaryTree();
Rightsubtree.root = root;
root.right = null;
return Rightsubtree;
}
- 定义一个新二叉树,将原二叉树复制,以后将二叉树根右孩子赋予null,这样右孩子与其后代即可所有删除。

- 若是要删除某一内部结点的子树怎么办?
- 刚开始我写的方法是这样的:
public LinkedBinaryTree removeRightsubtree(BinaryTreeNode node){
LinkedBinaryTree Rightsubtree = new LinkedBinaryTree();
Rightsubtree.node = node;
node.right = null;
return Rightsubtree;
}
- 然而并不知道具体的元素结点的索引,所以决定换个参数:
public LinkedBinaryTree removeRightsubtree(T Element){
LinkedBinaryTree Rightsubtree = new LinkedBinaryTree();
BinaryTreeNode node = new BinaryTreeNode(Element);
Rightsubtree.node = node;
node.right = null;
return Rightsubtree;
}
- 仿造删除根的子树的方法,直接给索引结点赋null,然而,node只是我本身新创建的结点,赋值为Element,并不是真正想删除的树的内部结点。

- 显而易见,没删除掉;
- 以后发现首要解决的是找到对应Element元素的位置,然而头铁的我刚开始打算本身写,写了半天一大堆错误以后,才记起有个findNode方法:

- 前面同样先将原树复制,后面找到Element所在位置,而后对其子树进行赋值null,便可删除。

返回目录

返回目录
上周考试错题总结
- 错题1:上周无测试活动。
- 解决:
- 错题2:
- 解决:
- 错题3:
- 解决:
返回目录
结对及互评
点评过的同窗博客和代码
- 本周结对学习状况:
- 20172316赵乾宸
- 博客中值得学习的或存在问题:
- 20172329王文彬
- 博客中值得学习的或存在问题:
- 博客内容充实、排版整齐、对教材内容有通过一番认真思考、继续保持。
- 代码截图作标注时应尽可能避免遮挡代码。
- Markdown的部分缩进有误。
- 教材问题2提出得很好,能够看出近断时间来反复使用链表、数组去实现同一类型的数据结构起得了必定的成效。
返回目录
学习进度条
目标 |
3000行 |
15篇 |
300小时 |
第一周 |
0/0 |
1/1 |
12/12 |
第二周 |
935/935 |
1/2 |
24/36 |
第三周 |
849/1784 |
1/3 |
34/70 |
第四周 |
3600/5384 |
1/5 |
50/120 |
第五周 |
2254/7638 |
1/7 |
50/170 |
第六周 |
2809/10447 |
1/9 |
45/215 |
返回目录
参考资料