Trees 授課者:驕芸.

Slides:



Advertisements
Similar presentations
1 第八章 深入探討樹狀結構. 2 目次 8.1 m-way 搜尋樹 8.2 B-tree 8.3 動動腦時間 8.4 練習題解答.
Advertisements

While 迴圈 - 不知重複執行次數
第7章 樹與二元樹 (Trees and Binary Trees)
資料結構 老師:李崇明 助教:楊斯竣.
Tree (2): heap, deap, 2-3 tree, 2-3-4tree
資料結構(計財系).
Chapter 6 樹狀結構.
Chapter 5 樹狀結構.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
§4 Additional Binary Tree Operations
Chap4 Tree.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
Chap5 Graph.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
資料結構 第3章 鏈結串列.
結構(struct).
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置 4-2 鏈結串列的基礎 4-3 單向鏈結串列 4-4 環狀鏈結串列
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
第11章 資料結構 – 使用C語言的模組 11-1 資料結構的基礎 11-2 C語言的模組化程式設計 11-3 基本鏈結串列
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
第7章 樹與二元樹 (Trees and Binary Trees)
樹狀結構 Trees.
第七章 AVL搜尋樹 二元搜尋樹簡單易懂,不過有一個問題:它並非平衡樹。本章將介紹平衡的 AVL 搜尋樹,討論它的資料結構、函式,並設計程式使用它。
搜尋資料結構 Search Structures.
第12章 樹狀搜尋結構 (Search Trees)
資料結構與C++程式設計進階 鏈結串列 講師:林業峻 CSIE, NTU 6/ 10, 2010.
資料結構 第6章 樹狀結構.
(Circular Linked Lists)
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第 七 章 樹狀結構 課程名稱:資料結構 授課老師:________ 2019/1/1.
資料結構–樹(Tree) 綠園.
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
鄧姚文 資料結構 第六章:樹(Tree) 鄧姚文
Chapter 9 高度平衡二元搜尋樹 AVL Binary Search Tree
樹狀結構 Tree Structure chapter 7 德明科技大學資訊科技系.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
Chap3 Linked List 鏈結串列.
Chapter 11 B-tree 11.1 m-way 搜尋樹 11.2 B-tree.
第六章 樹狀結構 T r e e 版權屬作者所有,非經作者 同意不得用於教學以外用途.
計數式重複敘述 for 迴圈 P
樹 2 Michael Tsai 2013/3/26.
2-3-4 Tree and how it relates to Red Black Tree
感謝同學們在加分題建議. 我會好好研讀+反省~
B+ Tree.
Chap4 Tree.
資料結構 7-1 陣列 7-2 鏈結串列 7-3 堆疊和佇列 7-4 樹狀結構.
資料結構使用Java 樹(Tree).
Reference to FUNDAMENTALS OF DATA STRUCTURE IN C++
第7章 樹與二元樹(Trees and Binary Trees)
資料結構與C++程式設計進階 樹狀結構(Tree) 講師:林業峻 CSIE, NTU 11/ 12, 2009.
第 八 章 高等樹 課程名稱:資料結構 授課老師:________ 2019/4/28.
資料結構使用Java 第9章 樹(Tree).
C qsort.
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
累堆排序法 (Heap Sort).
資料結構使用Java 第6章 鏈結串列(Linked List).
陣列與結構.
第六章 二元搜尋樹 現在我們的注意焦點要轉到搜尋樹(search tree)了,要深度討論兩種標準的樹結構(tree structure),就是本章所要說明的二元搜尋樹(binary search tree)以及下一章所要討論的 AVL 平衡樹(AVL tree)。這兩種樹其資料都依序排列的,它們之間的差別只在於.
動畫演示 Node規範了一些基本的方法,像是增加節點、刪除節點、讓節點做一些事、取得第n個節點等等
6.1 樹狀結構的一些專有名詞 6.2 二元樹 6.3 二元樹的表示方法 6.4 二元樹的追蹤 6.5 引線二元樹 6.6 其它議題
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
第7章 資料結構 7-1 陣列 7-2 鏈結串列 7-3 堆疊和佇列 7-4 樹狀結構.
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
鏈結串列 Link List chapter 6 德明科技大學資訊科技系.
10303: How Many Trees? ★★☆☆☆ 題組:Contest Archive with Online Judge
第10章 二元搜尋樹 (Binary Search Tree)
JAVA 程式設計與資料結構 第十七章 Tree.
函式庫補充資料 1.
Presentation transcript:

Trees 授課者:驕芸

Outline Tree Binary Tree Delete Nodes from Binary Tree Thread Binary Tree

Tree 定義:由一個或多個節點構成的有限集合。 特性: 常用術語: 有一特定節點稱為樹根(Root) 其餘的節點之集合稱為子樹(Subtree) 常用術語: Root:沒有父節點的節點 Leaf:沒有子節點的節點 Sibling:同一個父節點的所有子節點 Ancestors:從該節點至root所經過的所有節點 Degree(分支度):該節點所擁有的子節點數 Non-terminal Node:非樹葉的節點, 即degree>=1的節點

Tree 術語: Level(階層):樹根的階層為1,若某節點的階層為i,則子節點的階層就為i+1 Height(高度或深度):一棵樹所具有的最大階層. level 1 2 3 A B C D E F G

Binary Tree 節點個數是有限的,且可以沒有節點。 二元樹可以分為兩個子樹稱為左子樹與右子樹。 左、右子樹亦是二元樹。 又稱為有序樹,每一個節點之degree<=2,左右有次序之分。 表示法: 陣列 結構陣列 鏈結結構(hw1)

Binary Tree表示法---陣列 左子樹是父節點乘以2 右子樹是父節點乘以2+1 演算法步驟: 1.將第一個元素插入為 根節點。 儲存位置 左子樹是父節點乘以2 右子樹是父節點乘以2+1 演算法步驟: 1.將第一個元素插入為 根節點。 2.將插入的元素與節點值比較,若大於大於節點值,將此元素送往節點的右子樹,若右子樹不是空的,則需要重複比較,否則建立節點且將元素值插入。 3.若小於節點值,將此元素送往節點的左子樹,類似上述法。 level 1 2 3 [1] [3] [2] [4] [5] [6]

Binary Tree陣列表示法---範例 將下列資料依序輸入一個二元樹,則建立的二元樹如下圖: 15,6,4,8,23,77,1,19 (1) 15 (2) (3) 6 23 (4) (5) (6) (7) 4 8 19 77 (8) 1

Binary Tree陣列表示法---程式碼 #include<stdio.h> #include<stdlib.h> void createbtree(int *btree,int *data,int len) { int level; /*樹的階層*/ int i; btree[1] = data[0]; /*建立根節點*/ for ( i = 2; i <= len; i++ ) /*用迴路建立其 它節點*/ { level = 1; /*從階層1開始*/ while ( btree[level] != 0 ) /*是否有子樹*/ if ( data[i-1] > btree[level] ) /*是左或右子 樹*/ level = level * 2 + 1; /*右子樹*/ else level = level * 2; /*左子樹*/ } btree[level] = data[i-1]; /*存入節點資料*/ int main() { int btree[16]; /* 二元樹陣列*/ /* 二元樹節點資料 */ int data[8]={15,6,4,8,23,77,1,19}; int i; for( i = 1; i < 16; i++ ) /*清除二元樹陣列*/ btree[i]=0; createbtree(btree,data,8); /*建立二 元樹*/ for( i =1; i <16;i++) /*列出二元樹內容*/ printf("%2d: [%d] \n",i,btree[i]); system("pause"); return 0; } btree[16], 宣告為16的原因: 因為此binary tree是四層, 所以最多會有2^4-1=15個節點 因為節點建立從index為1開始, 會浪費掉1個空間

Binary Tree表示法---結構陣列 每個節點至多擁有兩個子節點與一個資料欄位. 結構宣告如下圖所示: struct tree { int data; int left; int right; }; typedef struct tree treenode; treenode btree[15]; left data right

結構陣列表示法 index left data right 1 15 2 -1 6 23 3 77 (0) 15 (1) (2) 6 23 1 15 2 -1 6 23 3 77 (0) 15 (1) (2) 6 23 (3) 77 Index為0表示樹根 Left欄位是-1,表示沒有左子樹 Right欄位是-1,表示沒有右子樹

Binary Tree結構陣列表示法---程式碼1/2 for(i=1;i<len;i++) /*用迴路建立其它節點*/ { btree[i].data = data[i]; /* 建立節點內容*/ level=0; /*從樹根開始*/ pos=0; /*設定pos值*/ while(pos==0) /*用迴路找節點位置*/ { /*比較是左或右子樹*/ if(data[i]>btree[level].data ) { /*右樹是否有下一階層*/ if(btree[level].right!=-1) level = btree[level].right; else pos = -1; /*是右子樹*/ } { /*左樹是否有下一階層*/ if ( btree[level].left != -1 ) level = btree[level].left; pos = 1; /*是左子樹*/ if ( pos == 1 ) /*建立節點左右位置*/ btree[level].left = i; /*鏈結左子樹*/ btree[level].right = i; /*鏈結右子樹*/ #include <stdlib.h> struct tree /*樹的結構宣告*/ { int data; /*節點資料*/ int left; /*指向左子樹的位置*/ int right; /*指向右子樹的位置 */ }; typedef struct tree treenode; /*樹的結構新型 態*/ treenode btree[15]; /*宣告樹的結構陣列*/ void createbtree(int *data,int len) int level; /*樹的階層*/ int pos; /* -1是右樹,1是左樹 */ int i; btree[0].data = data[0]; /* 建立樹根節點*/

Binary Tree結構陣列表示法---程式碼2/2 void main() { /* 二元樹節點資料 */ int data[8] = {15,6,4,8,23,77,1,19}; int i; for ( i = 0; i < 15; i++ ) /*清除樹狀結構陣列*/ { btree[i].data = 0; /*設定初始內容*/ btree[i].left = -1; /*設定初始內容*/ btree[i].right = -1; /*設定初始內容*/ } createbtree(data,8); /*建立二元樹*/ printf(" 左 資料 右\n"); printf("----------------- \n"); for ( i = 0; i < 15; i++ ) /*列出二元樹內容*/ if ( btree[i].data != 0 ) /*是否是樹的節點*/ printf("%2d:[%2d] [%2d] [%2d]\n",i,btree[i].left, btree[i].data,btree[i].right); system("pause");

Binary Tree表示法---鏈結結構 使用動態記憶體配置建立二元樹。 使用節點結構的左、右指標欄位來表示父和子節點。 結構宣告如右圖所示: struct tree { int data; struct tree *left; struct tree *right; }; typedef struct tree treenode; typedef treenode *btree; data left right

鏈結結構表示法 15 15,6,23,77 6 23 null null null 77 null null

Delete Nodes from Binary Tree 刪除節點後,依然滿足二元樹的資料排列原則,可分三種情況: 1.節點沒有左子樹 2.節點沒有右子樹 3.節點有左和右子樹

節點沒有左子樹 沒有左子樹的二元樹 刪除根節點: 刪除葉節點: 刪除中間節點: 改變根節點的指標 將其父節點指向null root root 5 6 9 18 7 null null null null

節點沒有右子樹 沒有右子樹的二元樹 刪除根節點: 刪除葉節點: 刪除中間節點: 改變根節點的指標 將其父節點指向null root 10 8 5 7 6 null null null null

節點有左和右子樹1/2 刪除根節點: 在左右子樹中,找尋一個節點,可使整棵二元樹搬移動作最少者. root 刪除根節點: 在左右子樹中,找尋一個節點,可使整棵二元樹搬移動作最少者. Ex.刪除節點6, 可在節點4與8的範圍中, 找尋一節點, 即可找尋4的右子樹或8的左子樹, 以樹葉節點尤佳. 6 8 4 3 5 9 7 1 null 20 null null null null null null null

節點有左和右子樹2/2 刪除沒有左節點或沒有右節點的節點: Ex.刪除節點4 root 5 8 4 3 null 9 7 1 20 null

Thread Binary Tree 充分利用空的鏈結欄位,使其指到其他的節點,這些指標稱為thread,而這種二元樹就稱為Thread Binary Tree. 當右子樹為空的,將指標指向中序走訪的下一個節點。 當左子樹為空的,將指標指向中序走訪的前一個節點。

Thread Binary Tree範例 Binary Tree Thread Binary Tree 5 5 4 6 4 6 2 8 2 1 3 1 3 7 9 7 9 中序走訪的結果:1, 2, 3, 4, 5, 6, 7, 8, 9

Thread Binary Tree宣告 struct thread_tree { int data; int leftthread; int rightthread; struct tree *left; struct tree *right; }; typedef struct thread_tree treenode; typedef treenode *thread; leftthread data rightthread left right

開頭結點 1 5 4 1 1 6 2 8 1 7 1 1 3 1 9