第10章 二元搜尋樹 (Binary Search Tree)

Slides:



Advertisements
Similar presentations
C语言程序设计 李伟光.
Advertisements

教學經驗分享 吳毅成 國立交通大學資訊工程系 2012年4月.
第7章 樹與二元樹 (Trees and Binary Trees)
Chapter 06 Tree and binary tree 第六章 树和二叉树
動畫與遊戲設計 Data structure and artificial intelligent
第6章 二叉树和树 前面的章节主要讨论的是线性结构,二叉树和树属于非线性的结构。遍历非线性结构比线性结构要麻烦。
第三章 鏈結串列 Linked List.
102學年度預算編製說明會 主辦單位:會計室 102/02/22.
计算机软件技术基础 数据结构与算法(4).
数据结构——树和二叉树 1/96.
引入树 线性表、堆栈和队列都是线性结构,它们的共同特点:一对一; 计算机对弈中的一个格局可能有多个后继格局,用线性结构难以描述。
第六章 树和二叉树.
第5章 树( Tree )和二叉树 5.1 树的基本概念 5.2 二叉树 5.3 遍历二叉树和线索二叉树 5.4 树和森林
CH6 树和二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林
数据结构 第六章 树与二叉树 深圳大学计算机系 蔡茂国.
第五章 树 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋.
§4 Additional Binary Tree Operations
Chap4 Tree.
Tree(樹) 什麼是「樹」? 「樹」的範例 「樹」的定義 「樹」的表示法.
第9课 北美大陆上的新体制 导入新课 新课教学 课堂小结 知识结构 巩固练习
Linked List Operations
Chapter 5 Tree & Binary Tree
Chap5 Graph.
樹狀結構 陳怡芬 2018/11/16 北一女中資訊專題研究.
Chapter8 Binary and Other Trees
講師:郭育倫 第3章 基本資料結構 講師:郭育倫
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
数 据 结 构 Ch.6 树 计 算 机 学 院 肖明军
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
哈夫曼编码.
Chapter 5 樹(Trees).
第12章 樹狀搜尋結構 (Search Trees)
第六章 二叉树和树 6.1树的基本概念 6.2二叉树 6.3二叉树遍历 6.4线索二叉树 6.5树和森林 6.6树的应用(霍夫曼树及其编码)
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第六章 树和二叉树.
第 七 章 樹狀結構 課程名稱:資料結構 授課老師:________ 2019/1/1.
資料結構與C++程式設計進階 堆疊與佇列(Stack & Queue) 講師:林業峻 CSIE, NTU 6/ 21, 2010.
五、链 表 1、单链表 2、双向链表 3、链表应用.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
樹狀結構 Tree Structure chapter 7 德明科技大學資訊科技系.
親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
第7章 树和二叉树 7.1 树 7.2 二叉树 7.3 以结点类为基础的二叉树设计 7.4 二叉树类 7.5 二叉树的分步遍历
Data Structure.
二叉树和其他树 (Binary and other trees)
第六章 樹狀結構 T r e e 版權屬作者所有,非經作者 同意不得用於教學以外用途.
第九章 查找 2019/2/16.
C/C++/Java 哪些值不是头等程序对象
樹 2 Michael Tsai 2013/3/26.
感謝同學們在加分題建議. 我會好好研讀+反省~
Tree & Binary Tree.
書名 Java於資料結構與演算法之實習應用
第6章 树和二叉树 本章主题:树、二叉树 教学目的:掌握树和二叉树的类型定义、运算及存储结构 教学重点:树的各种表示、各种存储方式和运算,
二叉树的遍历.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
鄧姚文 資料結構 第一章:基本概念 鄧姚文
第六章 树和二叉树 学习要点 理解树的定义和基本术语,重点了解二叉树的定义、性质、存储结构; 掌握二叉树遍历的递归算法及它的典型运算;
第7章 樹與二元樹(Trees and Binary Trees)
資料結構使用Java 第9章 樹(Tree).
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
Chapter 6 樹狀結構.
106二專班第二次作業 2017/11/27.
第二章 Java基本语法 讲师:复凡.
中国农业科学院博士后学术论坛 博士后基金申请的经验及体会 中国农业科学院生物技术研究所 秦 华 博士
班級經營分享 主講人:吳姈娟 時間:104年3月4日.
方格紙上畫正方形.
所得稅法第14條、第126條修正條文 薪資所得計算方式二擇一 定額減除 特定費用減除 維持現行薪資所得特別扣除額20萬元減除方式
Data Structure.
104 四技二專甄選入學 簡章解析 輔導室 何乙娟.
JAVA 程式設計與資料結構 第十七章 Tree.
Presentation transcript:

第10章 二元搜尋樹 (Binary Search Tree) 資料結構使用Java 第10章 二元搜尋樹 (Binary Search Tree)

課程內容 二元樹追蹤 前序追蹤 中序追蹤 後序追蹤 二元搜尋樹 建立二元搜尋樹的方法 程式碼撰寫實作 刪除二元搜尋樹

二元樹的追蹤 二元樹追蹤(binary tree traversal)是樹最重要的 基本運算。 追蹤時保存著3項重要的資訊: 節點資料 指向左子樹的鏈結 指向右子樹的鏈結。

二元樹的追蹤 前序(Preorder): 中序(Inorder) : 後序(Postorder): 樹根→左子樹→右子樹(DLR) 左子樹→樹根→右子樹(LDR) 後序(Postorder): 左子樹→右子樹→樹根(LRD)

前序追蹤(Preorder traversal) 追蹤順序: 節點資料 拜訪左子樹 拜訪右子樹

【範例一】 試寫出下圖之前序追蹤順序。 B C E F I D G J H A L K

前序追蹤 (遞迴演算法) 若樹根節點不為空節點,則執行下列步驟: 1.走訪樹根 2.走訪左子樹(遞迴) 3.走訪右子樹(遞迴) 下載原程式碼 若樹根節點不為空節點,則執行下列步驟: 1.走訪樹根 2.走訪左子樹(遞迴) 3.走訪右子樹(遞迴) 下載原程式碼 public void preOrder(){ System.out.print(data+" "); if(left!=null) left.preOrder(); if(right!=null) right.preOrder(); }

中序追蹤(Inorder traversal) 追蹤順序: 拜訪左子樹 節點資料 拜訪右子樹

【範例二】 試寫出下圖之中序追蹤順序。 B C E F I D G J H A L K

中序追蹤 (遞迴演算法) 若樹根節點不為空節點,則執行下列步驟: 1.走訪左子樹(遞迴) 2.走訪樹根 3.走訪右子樹(遞迴) 若樹根節點不為空節點,則執行下列步驟: 1.走訪左子樹(遞迴) 2.走訪樹根 3.走訪右子樹(遞迴) public void inOrder(){ if(left!=null) left.preOrder(); System.out.print(data+" "); if(right!=null) right.preOrder(); }

後序追蹤(Postorder traversal) 追蹤順序: 拜訪左子樹 拜訪右子樹 節點資料

【範例三】 試寫出下圖之後序追蹤順序。 B C E F I D G J H A L K

後序追蹤 (遞迴演算法) 若樹根節點不為空節點,則執行下列步驟: 1.走訪左子樹(遞迴) 2.走訪右子樹(遞迴) 3.走訪樹根 若樹根節點不為空節點,則執行下列步驟: 1.走訪左子樹(遞迴) 2.走訪右子樹(遞迴) 3.走訪樹根 public void postOrder(){ if(left!=null) left.preOrder(); if(right!=null) right.preOrder(); System.out.print(data+" "); }

二元搜尋樹 Binary Search Tree

二元搜尋樹(Binary Search Tree) 為一種「有大小順序」的二元樹。 任何節點 左子樹之值小於節點的值 右子樹之值大於節點的值 左子樹和右子樹亦是二元搜尋樹。 將二元搜尋樹中序追蹤,即可得到排序後由小至 大的資料。 50 30 72 42 95

建立二元搜尋樹 建立二元搜尋樹時,必須加入大小排序規則: 以第一個資料當作樹根 之後之資料與樹根比較 若小於樹根則成為樹根之左子樹 若大於樹根則成為樹根之右子樹 如此一直遞迴之進行。

建立二元搜尋樹 輸入資料: 37, 57, 23, 15, 32。

建立二元搜尋樹-程式碼 使用者輸入的第一個數字成為樹根節點(root)。 建立insert方法來新增節點。 treeNode root = new treeNode(sc.nextInt()); 建立insert方法來新增節點。 呼叫insert時傳入新節點(newNode)參數。 root.insert(new treeNode(sc.nextInt())); insert方法判斷目前節點與新節點的data大小 新節點data較小:新增到左子樹。 新節點data較大:新增到右子樹。 若左、右子樹為空,則直接將新節點掛上。

建立二元搜尋樹-程式碼 if(newNode.data < data){ //新節點data較小 if(left == null) //左子樹為空 left = newNode; else left.insert(newNode); //新增到左子樹 }else{ if(right == null) right = newNode; right.insert(newNode); }

刪除二元搜尋樹節點 若是樹葉節點:直接刪除 若是內部節點: 例:刪除右圖50 50 65 40 45 30 在左子樹找數值最大的節點取代之 或是在右子樹找數值最小的節點取代之 例:刪除右圖50 50 40 65 45 30 60

刪除二元搜尋樹節點 60 40 65 45 30 取右子樹最小的節點 或是取左子樹最大的節點 45 40 65 60 30