1. 程式人生 > >【資料結構】資料結構探索(三) —— 二叉搜尋樹(Binary Search Tree)

【資料結構】資料結構探索(三) —— 二叉搜尋樹(Binary Search Tree)

二叉搜尋樹是一種有順序的二叉樹,它具有以下特徵:

1.每個元素有一個關鍵字,並且任意兩個元素的關鍵字都不同;因此所有的關鍵字都是唯一的。 
2.在根節點的左子樹中,元素的關鍵字(如果有的話)都小於根節點的關鍵字。 
3.在根節點的右子樹中,元素的關鍵字(如果有的話)都大於根節點的關鍵字。 
4.根節點的左右子樹也是二叉搜尋樹

二叉搜尋樹的節點

正如前面所說,每個二叉搜尋樹的結點,包含關鍵字key、左孩子指標lchild、右孩子指標rchild以及父結點指標parent。在C++實現中,我們定義一個結點類BSTNode來表示一個結點,並初始化結點的關鍵字等於0,左右孩子指標和父結點指標為Null

二叉搜尋樹的查詢

二叉樹的查詢十分簡單,只要和節點的關鍵字對比大小,然後順著左或者右一路查詢下去就可以了,如果查詢到葉子節點都沒有找到,就返回空。

若假設樹的高度是h,那麼查詢過程的時間複雜度就是O(h),因為我們的二叉樹的高度實際上是\log_{2}n,所以複雜度實際上是O(\log_{2}n).

二叉搜尋樹的插入

BST的插入過程非常簡單,很類似與二叉樹搜尋樹的查詢過程。當需要插入一個新結點時,從根節點開始,迭代或者遞歸向下移動,直到遇到一個空的指標NIL,需要插入的值即被儲存在該結點位置。這裡給出迭代插入演算法,遞迴方式的比較簡單。

因為二叉搜尋樹並不需要考慮平衡問題,所以只要和現有節點對比,向左或者向右走到底,插入子節點即可。

二叉搜尋樹的刪除

二叉搜尋樹的結點刪除比插入較為複雜,總體來說,結點的刪除可歸結為三種情況:
1、 如果結點z沒有孩子節點,那麼只需簡單地將其刪除,並修改父節點,用NIL來替換z;
2、 如果結點z只有一個孩子,那麼將這個孩子節點提升到z的位置,並修改z的父節點,用z的孩子替換z;
3、 如果結點z有2個孩子,那麼查詢z的後繼y,此外後繼一定在z的右子樹中,然後讓y替換z。

情況1:

情況2:

情況3:

可分為兩種型別,一種是z的後繼y位於其右子樹中,但沒有左孩子,也就是說,右孩子y是其後繼。如下:

另外一種型別是,z的後繼y位於z的右子樹中,但並不是z的右孩子,此時,用y的右孩子替換y,然後再用y替換z。如下:

二叉搜尋樹的遍歷

二叉搜尋樹的性質允許通過簡單的遞迴演算法來輸出樹中所有的關鍵字,有三種方式:先序遍歷、中序遍歷、後序遍歷。其中,先序遍歷中輸出根的關鍵字在其左右子樹的關鍵字之前;中序遍歷中輸出根的關鍵詞位於其左子樹的關鍵字和右子樹的關鍵字之間;後序遍歷中輸出根的關鍵字在左右子樹的關鍵字之後。

相關推薦

資料結構資料結構探索 —— 搜尋(Binary Search Tree)

二叉搜尋樹是一種有順序的二叉樹,它具有以下特徵: 1.每個元素有一個關鍵字,並且任意兩個元素的關鍵字都不同;因此所有的關鍵字都是唯一的。  2.在根節點的左子樹中,元素的關鍵字(如果有的話)都小於根節點的關鍵字。  3.在根節點的右子樹中,元素的關鍵字(如果有的話)都大

基礎資料結構與演算法實現2搜尋BST

import java.util.LinkedList; import java.util.Queue; public class BST <E extends Comparable<E>> { private c

《 常見演算法與資料結構》符號表ST4——查詢刪除 附動畫

符號表ST(4)——二叉查詢樹刪除 (附動畫) 本系列文章主要介紹常用的演算法和資料結構的知識,記錄的是《Algorithms I/II》課程的內容,採用的是“演算法(第4版)”這本紅寶書作為

資料結構——8——搜尋的插入和刪除操作

二叉搜尋樹的插入操作 我們要在二叉搜尋樹中執行各種操作的前提就是,我們首先要有一棵二叉搜尋樹。那麼,如何建立一棵二叉搜尋樹呢?最簡單的方法就是我們可以從一棵空樹開始,每次呼叫一個addNode函式,將一個新的值插入二叉搜尋樹中。但是在每次插入的時候我們都要保持

資料結構——7——搜尋及其操作原理

二叉樹與二叉搜尋樹 在之前的文章中,我們提到過三叉樹,n叉樹,但是我們實際用的最多卻是二叉樹,因為這樣的結構更適合我們程式設計和更適合我們使用遞迴的方式。所以我們可以限制孩子的數量使得生成的樹更容易實施。那麼怎麼定義二叉樹呢? - 樹中的每個節點至多有兩個孩

javascript實現幾道題目帶你學習搜尋

二叉樹大家都知道,二叉搜尋樹滿足以下特徵: 節點的左子樹只包含小於當前節點的數 節點的右子樹只包含大於當前節點的數 所有左子樹和右子樹自身必須也是二叉搜尋樹 二叉搜尋樹也叫二叉排序樹,中序遍歷二叉搜尋樹的結果就是一次遞增的遍歷。 一、二叉搜尋樹的建立 相關題目:lee

劍指offer學習筆記Python--搜尋的後序遍歷序列

題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路 知識點回顧: 二叉搜尋樹(Binary Search Tree,BST)又稱二叉排序樹、二叉查詢樹  

劍指offer——24搜尋的後序遍歷序列

public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length==0) return false; if(sequence.lengt

劍指offer——20搜尋的第k個結點

最近作業好多 幾門結課作業一起來 很煩啊  中序遍歷二叉搜尋樹得到的就是升序的結點排列,遍歷的時候加個判斷是不是第k個結點就行了。  /* public class TreeNode { int val = 0; TreeNode left =

劍指offerC++——搜尋的第k個結點

題目描述 給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如,  按結點數值大小順序第三個結點的值為4。 思路:根據二叉搜尋樹的特點,中序遍歷的數值是遞增排序的,因此,只需中序遍歷二叉搜

數據結構 最小生成樹——prim算法

copy cost 是否 不用 wait 大樹 分享圖片 pri clas   上一期介紹到了kruskal算法,這個算法誕生於1956年,重難點就是如何判斷是否形成回路,此處要用到並查集,不會用當然會覺得難,今天介紹的prim算法在kruskal算法之後一年(即1957年

資料結構——定義和性質

二叉樹(Binary Tree)是n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個根結點和倆棵互不相交的,分別稱為根結點的左子樹和右子樹的二叉樹組成。 如圖: 二叉樹的特點 二叉樹的特點: 1.每個結點最多有倆棵子樹,所以二叉樹中不存在度

資料結構-二分搜尋(Binary Search Tree)

特點 動態資料結構 是一顆二叉樹 二分搜尋樹的每個節點的值: 每個節點的值都大於其左子樹的所有節點的值 每個節點的值都小於其右子樹的所有節點的值 每一顆子樹也是二分搜尋樹 儲存的元素必須有可比較性, Java中的話就要求二分搜尋樹儲存

mysqlmysql索引探索-- 高效能使用索引的策略

既然我們已經對索引的本質有所瞭解,那麼我們就應該來討論如何高效能的使用引擎。 1. 列的離散性越高,選擇性越好。 列的離散性是這樣定義的:count(discount col):count(col),也就是不同的列數比列的總數。這個數值越大說明列的離散型就越好。 如果用

筆記篇斜率優化dp APIO2010特別行動隊

tex http span type 2-2 參加 math 就是 裏的 旁聽了一波給舒老師和學弟的pkuwc面試講座... 這裏有一段隱身的吐槽, 想看的請自己想辦法觀看. 不想看的跳過這一段看似空白的東西就好了... 剛開始ATP學姐給我們講了自己面試的時候的事情.

數據結構實現

.data lis 父節點 集合 結構 ron 進棧 nod 建立 轉載:http://www.cnblogs.com/CherishFX/p/4617105.html 二叉樹( Binary Tree) 是 n(n>=0)個結點的有限集合,該集合或者為空集(稱為空二

AI實戰快速掌握TensorFlow:激勵函式

到現在我們已經瞭解了TensorFlow的特點和基本操作(見文章:快速掌握TensorFlow(一)),以及TensorFlow計算圖、會話的操作(見文章:快速掌握TensorFlow(二)),接下來我們將繼續學習掌握TensorFlow。 本文主要是學習掌握TensorFlow的激勵函式

VRay教程焦散效果之折射焦散

作者:活力網Caigle 課程學習:http://www.uzing.net/course_show-1918-6322-1-5-0.html 課程時長:17分鐘53秒 課程軟體:VRay 3.4 for SketchUp 課程內容:折射焦散與反射焦散略有不同。值得注意

機房重構——增刪改查

【改】 UI層 Entity.StuInfo stu = new Entity.StuInfo(); stu.UserID = txtUserID.Text.Trim(); stu.UserName = txtUserName.Text; stu.Sex = cmbSex.Text;

筆記篇斜率優化dp APIO特別行動隊

旁聽了一波給舒老師和學弟的pkuwc面試講座… 這裡有一段隱身的吐槽, 請反白觀看. 不想看的跳過這一段看似空白的東西就好了… 剛開始ATP學姐給我們講了自己面試的時候的事情..描繪了一下當時面試的場面和當時問的問題…ATP學姐太可愛了OvO可能準備的也不是