20182311 2019-2020-1「データ構造とオブジェクト指向プログラミング」9週の学習の概要

テキスト

20182311 2019-2020-1「データ構造とオブジェクト指向プログラミング」9週の学習の概要

コンテンツ概要を学びます

教科書第15章

  • 概要ツリー
    1. 定義:ツリーは階層的な組織における非線形素子の結果です。これは、ノードとノードを接続するエッジを含み、ツリーの最上位は、ルートのルート・ノード、プレゼンテーション層ノードに対するルートノードです。ツリー内のノードの子ノードが含まれていませんが、リーフノードで、ルートノードとリーフノード以外の他のノードはノードです。
    2. 順序木:ノードの最大数を含むサブノード。
    3. 経路長:エッジに接続されているノードの数2。高さ:リーフノードにルートノードから最長パスの長さ。
    4. N進ツリー:ノードの子ノードの任意の数がこれ以上n以下であります
    5. バランス:すべてのリーフノードは、同じレベルにあります
    6. 木は、木のバランス、及びリーフノードの底に残っている:完全
  • ツリーの実装:
    1. アレイの実装戦略:アレイは、ツリー、標識されたノードの左の部分木の配列添字を使用して実装N 2Nに、右サブツリー+ 1 2N標識。アイデアは単純で、迅速なアクセスですが、配列は、データ、ストレージスペースの無駄なく木の位置のためのスペースを割り当てます。
    2. アナログ接続ポリシー:スペースを節約するために、配列の配列インデックス、への子供たちは、ツリー内の要素、コストシフトの配列要素を削除するために増加します。
    3. リストの実装:リストは、ツリーを作るの最も一般的な方法では、バイナリノードリストは、リストを指すことが三叉親ノードは、リストは、1つまたは複数の兄弟にマルチブランチを指すことができ、周囲に接続することができます
  • ツリー横断:非再帰的トラバースよりも簡単な再帰的トラバーサルを、参照配列は他のトラバーサル順序を横断するように記述することができます。
    • 先行順走査:最初のルートノード、左の部分木の後、右部分木
    • 予約限定:最初の左部分木、ルートノード、右部分木
    • 後順:最初の左の部分木、右部分木、その後、ルートノード

    • 非再帰的トラバーサル例(一次)。
    public void preorderTraverse(){
          //非递归实现先序遍历
          Node t=root;
          Node top;
              Stack<Node> stack=new Stack<Node>();
              while(t!=null||!stack.isEmpty()){
                  while(t!=null){
                      System.out.print(t.getData()+"\t");
                      stack.push(t);
                      t=t.getLeft();
                  }
                  top=(Node)stack.peek();
                  stack.pop();
                  t=top.getRight();
              }
          }
    • 例えば再帰トラバーサル(一次)。
    public static void preOrderRe(Node t)
      {//递归实现前序遍历
          System.out.print(t.getData()+"\t");
          Node leftTree = t.getLeft();
          if(leftTree != null){
              preOrderRe(leftTree);
          }
          Node rightTree = t.getRight();
          if(rightTree != null){
              preOrderRe(rightTree);
          }
      }
    • (順番に)非再帰的トラバーサル例:
    public void midorderTraverse(){
          //非递归实现中序遍历
          Node t=root;
          Stack<Node> stack=new Stack<Node>();
          while(t!=null||!stack.isEmpty()){
              while(t!=null){
                  stack.push(t);
                  t=t.getLeft();
              }
              t=(Node)stack.peek();
              stack.pop();
              System.out.print(t.getData()+"\t");
              t=t.getRight();
          }
      }
    
    • 例えば、再帰的トラバーサル(順番に):
     public static void midOrderRe(Node t)
      {//递归实现中序遍历
          Node leftTree = t.getLeft();
          if(leftTree != null){
              midOrderRe(leftTree);
          }
          System.out.print(t.getData()+"\t");
          Node rightTree = t.getRight();
          if(rightTree != null){
              midOrderRe(rightTree);
          }
      }
    • 非再帰的トラバーサル(後続)の例:
    public void lasorderTraverse(){
          //非递归实现后序遍历
          Node t=root;
          Node top,last=null;
          Stack<Node> stack=new Stack<Node>();
          while(t!=null||!stack.isEmpty()){
              while(t!=null){
                  stack.push(t);
                  t=t.getLeft();
              }
              top=(Node)stack.peek();
              if(top.getRight()==null||top.getRight()==last){
                  stack.pop();
                  System.out.print(top.getData()+"\t");
                  last=top;
              }
              else{
                  t=top.getRight();
              }
          }
      }
    • 例えば、再帰的トラバーサル(以降):
    public static void lasOrderRe(Node t)
      {//递归实现后序遍历
          Node leftTree = t.getLeft();
          if(leftTree != null){
              lasOrderRe(leftTree);
          }
          Node rightTree = t.getRight();
          if(rightTree != null){
              lasOrderRe(rightTree);
          }
          System.out.print(t.getData()+"\t");
      }
    • トラバーサル順序:
    public void seqTraverse(Node t){
          //利用队列先进先出实现层级遍历
          Queue<Node> queue=new LinkedList<Node>();
          queue.add(t);
          while(!queue.isEmpty()){
              Node q=queue.peek();
              queue.remove();
              if(q.getLeft()!=null){
                  queue.add(q.getLeft());
              }
              if(q.getRight()!=null){
                  queue.add(q.getRight());
              }
              System.out.print(q.getData()+"\t");
          }
      }
  • 决策树:基于链树实现,将决策信息填入结点中,定义一个访问方法,设置判定条件为输入n即访问左子树,输入y即访问右子树。

教材第16章

  • 二叉查找树的概述:
    • 定义:二叉查找树在二叉树的基础上规定了,左孩子小于父节点,父节点又小于等于右孩子。
    • 具体过程:

  • 一些方法:addElement、removeElement(不能简单的删除节点的相关引用指针,而是要寻找替代点),replacement(寻找替代点的方法,若结点没有孩子,返回空;若结点只有一个孩子,返回这个孩子;若结点有两个孩子,返回他的后继/前继结点),后继就是按顺序排列后他的后面一位,前继就是按顺序排列后他的前面一位。这两个结点一定没有孩子,否则就不是前继/后继结点(分别位于左子树的最右边和右子树的最左边)
  • 一些异常:树中元素不是Comparable,addElemnt会抛出NoComparableElementException异常。

教材学习中的问题和解决过程

  • 问题1:怎样实现从子结点返回到根结点?或者说建立虚空结点树的时候,遇到#返回null以后怎么回到根节点重新赋值?
  • 问题1解决方案:尝试了两种方法,一种是建立三叉链表,能实现就是有点麻烦。递归的思想其实就包括返回上一级,所以直接使用递归就能

代码调试中的问题和解决过程

  • 问题1:返回空指针异常和0>1错误

  • 问题1解决方案:习惯规定search方法未找到元素返回-1,造成copyOf里面会出现(0,1)的情况。把未找到元素的返回值设置为1即可。

代码托管

结对及互评

点评过的同学博客和代码

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 10000行 30篇 400小时
第一周 246/246 2/2 30/30 初步掌握linux命令、java小程序和jdb调试
第二周 73/319 3/3 30/60
第三周 906/1225 3/6 20/80
第四周 748/1973 2/8 20/100
第五周 849/2822 2/10 20/120
第六周 962/ 3784 2/12 30/150
第七周 1883/5668 3/15 50/200
第八周 579/6247 1/16 30/230
第九周

おすすめ

転載: www.cnblogs.com/lengchong/p/11873918.html