二分探索木における要素削除 データ構造とプログラミング(10)

Slides:



Advertisements
Similar presentations
アルゴリズムとデータ構造 2011年7月7日
Advertisements

正規表現からのDFA直接構成.
アルゴリズムとデータ構造 2012年6月27日
2 分探索木 Binary Search Tree 実行可能な操作 計算量 木の高さは,最悪 O(n) n = |A| : 要素の個数
アルゴリズムとデータ構造 2013年6月18日
アルゴリズムとデータ構造1 2005年7月8日
Ex7. Search for Vacuum Problem
アルゴリズムとデータ構造 2010年7月5日
Ex8. Search for Vacuum Problem(2)
アルゴリズムとデータ構造 補足資料13-4 「2分探索木の追加・削除(ダイジェスト)」
アルゴリズムとデータ構造 2012年6月14日
情報工学概論 (アルゴリズムとデータ構造)
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造 補足資料4-2 「線形探索」
データ構造と アルゴリズム 第八回 知能情報学部 新田直也.
大岩 元 慶応大学環境情報学部 二分木 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2011年6月14日
アルゴリズムとデータ構造 2011年6月20日
アルゴリズムとデータ構造 2012年7月12日
第13回 ハッシュテーブルを使ったプログラム ~高速に検索するには?~.
二分探索木によるサーチ.
Cプログラミング演習 中間まとめ2.
アルゴリズムとデータ構造 2011年7月4日
ハッシュ表 データ構造とプログラミング(12)
アルゴリズムとデータ構造 2012年6月28日
アルゴリズムとデータ構造 2011年6月27日
第9章 例外処理,パッケージ 9.1 例外処理 9.2 ガーベッジコレクション.
アルゴリズムとデータ構造 2013年7月16日
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造1 2006年6月16日
アルゴリズムとデータ構造1 2005年7月15日
二分木のメソッド(続き).
木の走査.
アルゴリズムとデータ構造勉強会 第6回 スレッド木
アルゴリズムとデータ構造1 2005年7月1日
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
データ構造と アルゴリズム 第七回 知能情報学部 新田直也.
データ構造と アルゴリズム 第六回 知能情報学部 新田直也.
データ構造と アルゴリズム 第五回 知能情報学部 新田直也.
Cプログラミング演習 第10回 二分探索木.
アルゴリズムとデータ構造1 2009年7月9日
アルゴリズムとデータ構造1 2005年7月5日
アルゴリズムとデータ構造1 2005年6月24日
アルゴリズムとデータ構造 2010年6月21日
大岩 元 慶応大学環境情報学部 再帰 データ構造とプログラミング(8) 大岩 元 慶応大学環境情報学部
アルゴリズムとデータ構造 2010年7月26日
Ex7. Search for Vacuum Problem
プログラミング 4 木構造とヒープ.
簡易データベース 情報画像工学実験 I : 実験2 担当:関屋大雄(工学部1号棟515室)
アルゴリズムとデータ構造1 2006年7月11日
アルゴリズムとデータ構造 2011年6月23日
アルゴリズムとデータ構造 第3章 ヒープ 5月31日分
AVL木.
第9回 優先度つき待ち行列,ヒープ,二分探索木
アルゴリズムとデータ構造1 2006年7月4日
アルゴリズムとデータ構造 2012年7月2日
アルゴリズムとデータ構造1 2008年7月24日
アルゴリズムとデータ構造 2011年6月28日
アルゴリズムとデータ構造1 2006年6月23日
アルゴリズムとデータ構造 2013年7月1日
情報工学概論 (アルゴリズムとデータ構造)
アルゴリズムとデータ構造1 2009年7月2日
アルゴリズムとデータ構造 2013年7月2日
アルゴリズムとデータ構造 2013年7月8日
アルゴリズムとデータ構造 2012年6月25日
アルゴリズムとデータ構造 2012年6月21日
アルゴリズムとデータ構造1 2005年7月12日
アルゴリズムとデータ構造1 2007年7月6日
7.木構造 7-1.データ構造としての木 7-2.2分探索木 7-3.高度な木.
アルゴリズムとデータ構造 2012年7月9日
Presentation transcript:

二分探索木における要素削除 データ構造とプログラミング(10) 大岩 元 慶応大学環境情報学部 ohiwa@sfc.keio.ac.jp

節(ノード)の削除 削除するノードに子がない 削除するノードに子が1つある 削除するノードに子が2つある 削除するノードを見つけ、その親からの参照をnull にする 削除するノードに子が1つある 親の参照をそのノードの子への参照に変える 削除するノードに子が2つある そのノードの右の子の子孫の最小値を持つノードと入れ換え、必要な付け替えを行なう

削除するプログラム(最初の部分) public boolean delete( int key){ Node current = root; Node parent = root; boolean isLeftChild = true; while ( current.iData != key ) { parent = current; if ( key < durrent.iData ) { ifLeftChild = true; current = current.leftChild; } else { ieLeftChild = false; current = current.rightChild; if ( current = null) return false;

子の無いノードを削除する if ( current.leftChild == null && current.rightChild == null ) { if ( current == root) root = null; else if ( isLeftChild ) parent.leftChild = null; else parent.rightChild = null; }

削除するノードに子が1つある else if ( current.rightChild == null ) if ( current == root ) root = current.leftChild; else if ( isLeftChild ) parent.leftChild = current.leftChild; else parent.rightChild = current.leftChild; else if ( current.leftChild == null ) if (current == root) root = current.rightChild; else if (isLeftChild ) parent.leftChild = current.rightChild; else parent.rightChild = current.rightChild;

子が2つあるノードの削除が難しい例

後継者を決める private node getSuccessor ( node delNode ) { Node successorParent = delNode; Node successor = delNode; Node current = delNode.rightChild; while ( current != null) { successorParent = successor; successor = current; current = current.leftChild; } if ( successor != delNode.rightChild ) { successorParent.leftChild = successor.rightChild; successor.rightChild = delNode.rightChild; riturn successor;

削除のプログラム else { Node successor = getSuccessor ( current ); if ( current = root ) root = successor; else if ( isLeftChild ) parent.leftChhild = successor; else parent.rightChild = successor; successor.leftChild = current.LeftChild; } return true; } // end of delete