20162302 2017-2018-1 《程序设计与数据结构》第七周学习总结
教材学习内容总结
用链表实现二叉树
用数组实现二叉树
代码调试中的问题和解决过程
-
问题1:构建
getRight()
方法 -
解决方案:在
BTNode
里面就提供了getRight()
方法,在这里只需要判断root
是否为空就可以了
public LinkedBinaryTree<T> getRight() {
if (root == null)
return null;
else {
LinkedBinaryTree<T> result = new LinkedBinaryTree<T>();
result.root = root.getRight();
return result;
}
}
-
问题2:使用后序的方法遍历树
-
解决方法:书上引用了
ArrayIterator
类,但是我并没有找到这个类,所以就要自己简单的处理一下这个功能。参考java实现树前序,中序,后序遍历中的和书上的代码,根据书上的需求和参考网站的结构,采用调用其他方法来达到遍历的目的。
public void preorder() {
preor(root);
}
public void preor(BTNode h) {
if (h != null) {
a = a + h.getElement();
preor(h.left);
preor(h.right);
}
}
-
问题3:如何解决空间不足的问题
-
解决方法:可以直接引用
ArrayList
中的expandCapacity()
private void expandCapacity() {
T[] larger = (T[]) (new Object[tree.length * 2]);
for (int index = 0; index < tree.length; index++)
larger[index] = tree[index];
tree = larger;
}
-
问题4:如何在
getLeft()
方法中获取完整的树 -
解决方法:可以创造一个强制改变数组内容的
set()
方法
public void set(int a, T element) {
if (a > tree.length)
expandCapacity();
tree[a] = element;
}
然后通过公式获取数据的左儿子
并使用set()
转移到新的树里面,原本以为用2n+1就可以,后来发现这样会都丢失所有的右儿子
。但实际需求不是这个样子的。
这个是总结的左分支元素的序号,存在这样的规律:每一行的个数都是上一行的二倍,从第二行开始,本行的开头数字是下面两行数字的和,这一点可以运用到公式里面。
实现到代码就是
public class TranTree {
public static void main(String[] args) {
int a = 1, b ;
for (int i = 1; i <= 8 ;i = i * 2) {
b=a;
for (int j = 0; j < i; j++) {
System.out.print(b + " ");
b++;
}
a = 2*a+1;
System.out.println();
}
}
}
接下来的问题就是for循环中的i的限定值的确定
可以根据数组的长度确定数据的个数从而通过h=log(n+1)
确定树的阶数
public int getH(){
int a=2, b = 1;
while(a<tree.length+1){
a = a * 2;
b ++;
}
return b;
}
第i行的数据是2^(i-1)个所以需要一个求方的小方法(其实java自带这样的方法)
public int involution(int a, int b){
int c = a;
for(int i = 1; i<b-1; i++)
c = c * a;
return c;
}
最后通过整合得到
public CLArrayBinaryTree getLeft() {
CLArrayBinaryTree result = new CLArrayBinaryTree();
int a = 1, b , c = 0;
for (int i = 1; i <= involution(2,getH()) ;i = i * 2) {
b=a;
for (int j = 0; j < i; j++) {
result.set(c, tree[b]);
b++;
}
a = 2*a+1;
c++;
}
return result;
}
代码托管
结对及互评
- 博客中值得学习的或问题:
- 结对伙伴暂时未提交博客
本周结对学习情况
-
结对学习内容:
没有进行系统的结对学习
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 10/10 | |
第二周 | ??/?? | 1/2 | 15/25 | |
第三周 | 465/465 | 1/3 | 15/40 | |
第六&七周 | 443/908 | 3/7 | 40/80 | |
第八周 | 528/1436 | 2/9 | 20/100 |