ディレクトリ
テキスト
20182311 2019-2020-1「データ構造とオブジェクト指向プログラミング」9週の学習の概要 |
コンテンツ概要を学びます
教科書第15章
- 概要ツリー
- 定義:ツリーは階層的な組織における非線形素子の結果です。これは、ノードとノードを接続するエッジを含み、ツリーの最上位は、ルートのルート・ノード、プレゼンテーション層ノードに対するルートノードです。ツリー内のノードの子ノードが含まれていませんが、リーフノードで、ルートノードとリーフノード以外の他のノードはノードです。
- 順序木:ノードの最大数を含むサブノード。
- 経路長:エッジに接続されているノードの数2。高さ:リーフノードにルートノードから最長パスの長さ。
- N進ツリー:ノードの子ノードの任意の数がこれ以上n以下であります
- バランス:すべてのリーフノードは、同じレベルにあります
- 木は、木のバランス、及びリーフノードの底に残っている:完全
- ツリーの実装:
- アレイの実装戦略:アレイは、ツリー、標識されたノードの左の部分木の配列添字を使用して実装N 2Nに、右サブツリー+ 1 2N標識。アイデアは単純で、迅速なアクセスですが、配列は、データ、ストレージスペースの無駄なく木の位置のためのスペースを割り当てます。
- アナログ接続ポリシー:スペースを節約するために、配列の配列インデックス、への子供たちは、ツリー内の要素、コストシフトの配列要素を削除するために増加します。
- リストの実装:リストは、ツリーを作るの最も一般的な方法では、バイナリノードリストは、リストを指すことが三叉親ノードは、リストは、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 | |
第九周 |