• 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 + "	");
                    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

    参考资料

  • 相关阅读:
    (13)使用Ajax Helper 提高用户体验
    (12)改变图片的大小生成缩略图
    (11)通过表单上传文件
    程序员需要有多懒 ?- cocos2d-x 数学函数、常用宏粗整理
    xCode 4.X 免证书真机发布及调试
    35岁前必须做好的10件事情(转载)
    独自收集Cocos2d提供的字体!共57种(有对照的字体图)
    (10)根据关键字搜索
    tcp拥塞控制
    dpcnv reademe
  • 原文地址:https://www.cnblogs.com/yangjingdian/p/7712463.html
Copyright © 2020-2023  润新知