二叉搜索樹的構建

2021-01-10 一入代碼深似海

1 二叉搜索樹BST

二叉搜索樹(Binary Search Tree,簡寫BST),又稱為二叉排序樹或二叉查找樹。其定義為:對於樹中的每個節點,其左子樹的所有節點值都小於該節點的值,其右子樹的所有節點值都大於該節點的值。二叉搜索樹的任意一個子樹也是二叉搜索樹。

前驅節點和後繼節點

二叉樹通過某種方式遍歷後會得到一個序列結果,而某個節點的前驅節點就是遍歷序列中該節點的前一個節點,後繼節點就是遍歷序列中該節點的後一個節點。例如中序前驅節點就是中序遍歷二叉樹後該節點的前一個節點。

由於中序遍歷得到的序列是按從小到大排列的,中序前驅節點就是小於該節點的所有節點中最大的那個節點,中序後繼節點就是大於該節點的所有節點中最小的節點。

2.1 創建二叉搜索樹

2.1.1 創建過程

動態創建二叉樹就是將數組變成一個二叉樹,往往動態創建二叉樹都是創建二叉搜索樹。創建二叉搜索樹的過程就是不斷的向二叉樹中插入節點的過程。在插入節點過程中保證二叉搜索樹的特性:任意一節點的左子樹的所有節點都小於該節點,並且其右子樹的所有節點都大於該節點。例如用數組[10, 6, 8, 15, 13, 17, 11, 14]來創建二叉搜索樹。

1> 首先處理數據10,此時二叉樹的根節點為空,那麼直接把10當做根節點。

2> 處理元素6,與根節點比較:6<10,那麼將6作為根節點的左子節點插入。如下圖:

3> 處理元素8,與根節點比較:8<10,向左子樹移動後比較:8>6,將8作為6的右子節點插入。如下圖:

4> 處理元素15,與根節點比較:15>10,將15作為根節點的右子節點插入,如下圖所示:

5> 處理元素13,與根節點比較:13>10,向右子樹移動後比較:13<15,將13作為15的左子節點插入。如下圖所示:

6> 處理元素17,與根節點比較:17>10,向右子樹移動後比較:17>15,將17作為13的右子節點插入。如下圖所示:

7> 處理元素11,與根節點比較:11>10,向右子樹移動後比較:11<15,向左子樹移動後比較:11<13,將11作為13的左子節點插入。如下圖所示:

8> 處理元素14,與根節點比較:14>10,向右子樹移動後比較:14<15,向左子樹移動後比較:14>13,將14作為13的右子節點插入。如下圖所示,就創建了一棵二叉搜索樹:

2.1.2 總結

1> 由上述過程可以總結到,每個節點插入的過程中都會保證二叉樹為二叉搜索樹,二叉每一個節點都是作為二叉樹的葉子節點插入的。

2> 形成的二叉搜索樹中序遍歷順序為:6,8,10,11,13,14,15,17,一個從小到的的有序序列。

2.1.3 程序示例

給定二叉搜索樹的根節點root和帶插入元素i,有如下幾種情況:

1> 如果root為空,那麼直接將root的元素值賦為i;

2> 如果i小於root位置的元素r且root沒有左子節點,那麼直接將其作為root的左子節點插入;

3>如果i小於root位置的元素r且root有左子節點,將root換為root的左子節點從步驟2開始處理;

4>如果i大於root位置的元素r且root沒有右子節點,那麼直接將其作為root的右子節點插入;

5>如果i大於root位置的元素r且root有右子節點,那麼將root換位root的右子節點從步驟2開始處理;

可見這套規則應用了一個遞歸思想去處理插入問題,遞歸界限是帶插入節點總以葉節點的身份插入到已有的二叉搜索樹中。程序實例如下:

由上述可得,根據一個數組動態構建二叉樹的過程如下所示:

相關焦點

  • 二叉搜索樹遞歸版c++
    二叉搜索樹(Binary Search Tree),也稱為二叉排序樹(Binary Sort tree),是指一棵空樹或者具有下列性質的二叉樹:若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;若任意節點的右子樹不空,則右子樹上所有節點的值均
  • 二叉搜索樹迭代版c++
    回顧:1.什麼是二叉搜索樹二叉搜索樹(Binary Search Tree),也稱為二叉排序樹(Binary Sort tree),是指一棵空樹或者具有下列性質的二叉樹:若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;若任意節點的右子樹不空,則右子樹上所有節點的值均
  • 二叉樹:二叉搜索樹登場
    給定二叉搜索樹(BST)的根節點和一個值。思路之前我們講了都是普通二叉樹,那麼接下來看看二叉搜索樹。在關於二叉樹,你該了解這些!中,我們已經講過了二叉搜索樹。本題,其實就是在二叉搜索樹中搜索一個節點。那麼我們來看看應該如何遍歷。
  • leetcode樹之將有序數組轉換為二叉搜索樹
    序本文主要記錄一下leetcode樹之將有序數組轉換為二叉搜索樹題目將一個按照升序排列的有序數組,轉換為一棵高度平衡二叉搜索樹。本題中,一個高度平衡二叉樹是指一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。
  • 尋找Nemo的樂趣:什麼是二叉搜索樹?
    同理,二叉搜索樹通過在每一步都減少選項來幫助找到想要的東西。首先,二叉搜索樹到底是什麼?二叉搜索樹(BST)是一種特殊類型的樹形數據結構,由節點及其子節點組成,子節點也被視作「後代」,可以把它想像成一棵倒置的樹或者是樹的根部。每個節點最多只能有2個子節點:左節點和右節點。
  • 471,二叉搜索樹中的插入操作
    問題描述給定二叉搜索樹(BST)的根節點和要插入樹中的值,將值插入二叉搜索樹。輸入數據保證新值和原始二叉搜索樹中的任意節點值都不同。注意,可能存在多種有效的插入方式,只要樹在插入後仍保持為二叉搜索樹即可
  • leetcode樹之二叉搜索樹的最近公共祖先
    序本文主要記錄一下leetcode樹之二叉搜索樹的最近公共祖先題目給定一個二叉搜索樹百度百科中最近公共祖先的定義為:「對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(一個節點也可以是它自己的祖先)。」例如,給定如下二叉搜索樹: root = [6,2,8,0,4,7,9,null,null,3,5]!
  • 樹、二叉樹、二叉搜索樹的實現和特性
    、二叉樹、二叉搜索樹的實現和特性,《AVL 樹和紅黑樹的實現和特性》可以閱讀這篇。Binary Search Tree二叉搜索樹,也稱二叉搜索樹、有序二叉樹(Ordered Binary Tree)、排序二叉樹(Sorted Binary Tree),是指一顆空樹或者具有下列性質的二叉樹:
  • 什麼是二叉搜索樹,如何通過代碼實現它們?
    同理,二叉搜索樹通過在每一步都減少選項來幫助找到想要的東西。 首先,二叉搜索樹到底是什麼? 二叉搜索樹(BST)是一種特殊類型的樹形數據結構,由節點及其子節點組成,子節點也被視作「後代」,可以把它想像成一棵倒置的樹或者是樹的根部。
  • 457,二叉搜索樹的最近公共祖先
    給定一個二叉搜索樹百度百科中最近公共祖先的定義為:「對於有根樹 T 的兩個結點 p、q,最近公共祖先表示為一個結點 x,滿足 x 是 p、q 的祖先且 x 的深度儘可能大(p、q 為不同節點且均存在於給定的二叉搜索樹中。
  • 秒殺面試官之二叉搜索樹中序遍歷
    通過中序遍歷二叉搜索樹得到的關鍵碼序列是一個遞增序列。這是二叉搜索樹的一個重要性質,巧妙利用這一性質可以解決一系列二叉搜索樹問題。本系列以以下非遞歸中序遍歷代碼為核心,解決一系列相關問題。二叉搜索樹的最小絕對差(一)算法思路中序遍歷二叉搜索樹,第一個結點外的每個節點與其前一節點的差值,如果該值小於最小絕對差,就用它更新最小絕對差(初始可設為無窮)。
  • 網際網路公司高頻面試題目:如何把二叉搜索樹轉成累加樹
    538.把二叉搜索樹轉換為累加樹題目連結:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/提醒一下,二叉搜索樹滿足下列約束條件:節點的左子樹僅包含鍵 小於 節點鍵的節點。節點的右子樹僅包含鍵 大於 節點鍵的節點。左右子樹也必須是二叉搜索樹。
  • 二叉搜索樹的最近公共祖先
    就能看到劍指 offer 系列當前連載的所有文章了題目描述給定一個二叉搜索樹二叉搜索樹說明:所有節點的值都是唯一的。p、q 為不同節點且均存在於給定的二叉搜索樹中。題目思考如何利用二叉搜索樹的條件?如果限制只能用遞歸或者迭代, 如何解決?
  • 網際網路公司高頻面試題:二叉搜索樹中的插入操作
    開始修改二叉搜索樹701.二叉搜索樹中的插入操作連結:https://leetcode-cn.com/problems/insert-into-a-binary-search-tree/給定二叉搜索樹(BST)的根節點和要插入樹中的值,將值插入二叉搜索樹。
  • leetcode450_go_刪除二叉搜索樹中的節點
    題目給定一個二叉搜索樹的根節點 root 和一個值 key,刪除二叉搜索樹中的 key 對應的節點,並保證二叉搜索樹的性質不變。返回二叉搜索樹(有可能被更新)的根節點的引用。一般來說,刪除節點可分為兩個步驟: 首先找到需要刪除的節點; 如果找到了,刪除它。
  • 二叉搜索樹的基本操作(查找)
    1 查找樹是否包含某個節點1> 思考基礎由二叉搜索樹的特性:任一節點的左子樹的節點都小於該節點,其右子樹的節點都大於該節點。查找BST中是否包含某個節點的過程,首先比較根節點,如果查找值與根節點值相同,那麼返回true;如果查找值小於根節點,遞歸查找其左子樹;如果查找值大於其根節點,遞歸查找其右子樹。
  • leetcode449_go_序列化和反序列化二叉搜索樹
    設計一個算法來序列化和反序列化二叉搜索樹。 對序列化/反序列化算法的工作方式沒有限制。 您只需確保二叉搜索樹可以序列化為字符串,並且可以將該字符串反序列化為最初的二叉搜索樹。編碼的字符串應儘可能緊湊。注意:不要使用類成員/全局/靜態變量來存儲狀態。 你的序列化和反序列化算法應該是無狀態的。
  • 使用快慢指針把有序鍊表轉換二叉搜索樹
    按升序排序,將其轉換為高度平衡的二叉搜索樹本題中,一個高度平衡二叉樹是指一個二叉樹每個節點的左右兩個子樹的高度差的絕對值不超過 1。題中說了,是按照升序排列的單鍊表,我們只需要找到鍊表的中間節點,讓他成為樹的根節點
  • TypeScript 實戰算法系列:實現二叉搜索樹
    前言樹是一種非順序數據結構,它用於存儲需要快速查找的數據。現實生活中也有許多用到樹的例子,比如:家譜、公司的組織架構圖等。本文將詳解二叉搜索樹並用TypeScript將其實現,歡迎各位感興趣的開發者閱讀本文。
  • LeetCode - 將有序數組轉為二叉搜索樹
    sorted array: [-10,-3,0,5,9],One possible answer is: [0,-3,9,-10,null,5], which represents the following height balanced BST: 0 / \ -3 9 / / -10 5這道題是要將有序數組轉為二叉搜索樹