20162302 《程序设计与数据结构》第七周学习总结

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 + "\t");
                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;
    }

代码托管

结对及互评

  • 博客中值得学习的或问题:
    • 结对伙伴暂时未提交博客

本周结对学习情况

  • 20162329

  • 结对学习内容:
    没有进行系统的结对学习

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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

参考资料

posted @ 2017-10-22 22:59  20162302  阅读(187)  评论(0编辑  收藏  举报