1. 程式人生 > >【C++】實現的二叉搜尋樹BST

【C++】實現的二叉搜尋樹BST

概念:

二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹),二叉搜尋樹是一種特殊的二叉樹

二叉搜尋樹的性質:

1. 每個節點都有一個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。
2. 左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。
3. 右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。
4. 左右子樹都是二叉搜尋樹

根據二叉搜尋樹的性質知:對二叉搜尋樹進行中序遍歷得到的結點序列必然是一個有序序列。 接下來用C++程式碼實現搜尋二叉樹,若有錯誤或不足之處,還望各位大神指點。。。

程式碼:(程式碼中間包含了對基本功能(插入,刪除,查詢)的遞迴和非遞迴的實現)

  1. <span style="font-size:18px;">include <iostream>  
  2. #include <string>
  3. usingnamespace std;  
  4. template<class K,class V>  
  5. struct BSTreeNode  
  6. {  
  7.     K _data;            //值
  8.     V _freq;                //出現的頻率
  9.     BSTreeNode<K, V>* _left;      //指向左子樹的指標
  10.     BSTreeNode<K, V>* _right;     //指向右子樹的指標
  11.     BSTreeNode(const K& data, const V& freq)//初始化
  12.         :_data(data)  
  13.         , _freq(freq)  
  14.         , _left(NULL)  
  15.         , _right(NULL)  
  16.     {}  
  17. };  
  18. template<class K, class V>  
  19. struct BSTree  
  20. {  
  21.     typedef BSTreeNode<K, V> Node;  
  22. public:  
  23.     BSTree()//初始化
  24.         :_root(NULL)  
  25.     {}  
  26.     //插入
  27.     bool Insert(const K& data, const V& freq)  
  28.     {  
  29.         if (_root == NULL)//如果節點為空,就在此節點處加入data資料
  30.         {  
  31.             _root = new Node(data, freq);  
  32.             returntrue;  
  33.         }  
  34.         Node* parent = NULL;  
  35.         Node* cur = _root;  
  36.         while (cur)//搜尋data應該插入的節點:parent節點後
  37.         {  
  38.             if (data > cur->_data)//如果data大於節點的值,就繼續在節點的右子樹中插入data
  39.             {  
  40.                 parent = cur;  
  41.                 cur = cur->_right;  
  42.             }  
  43.             elseif (data < cur->_data)//如果data小於節點的值,就繼續在節點的左子樹中插入data
  44.             {  
  45.                 parent = cur;  
  46.                 cur = cur->_left;  
  47.             }  
  48.             else
  49.             {  
  50.                 cur->_freq++;  
  51.                 returntrue;  
  52.             }  
  53.         }  
  54.         //在parent節點後插入data
  55.         if (data > parent->_data)  
  56.         {  
  57.             parent->_right = new Node(data, freq);  
  58.         }  
  59.         else
  60.         {  
  61.             parent->_left = new Node(data, freq);  
  62.         }  
  63.         returntrue;  
  64.     }  
  65.     Node* Find(const K& data)//查詢
  66.     {  
  67.         Node* cur = _root;  
  68.         while (cur)  
  69.         {  
  70.             if (data >cur->_data)//若data大於當前節點,則在當前節點的右子樹中查詢
  71.             {  
  72.                 cur = cur->_right;  
  73.             }  
  74.             elseif (data < cur->_data)//若data小於當前節點,則在當前節點的左子樹中查詢
  75.             {  
  76.                 cur = cur->_left;  
  77.             }  
  78.             else
  79.             {  
  80.                 return cur;  
  81.             }  
  82.         }  
  83.         return NULL;  
  84.     }  
  85.     bool Remove(const K& data)//刪除
  86.     {  
  87.         Node* parent = NULL;  
  88.         Node* cur = _root;  
  89.         while (cur)//尋找data節點cur
  90.         {  
  91.             if (data > cur->_data)  
  92.             {  
  93.                 parent = cur;  
  94.                 cur = cur->_right;  
  95.             }  
  96.             elseif (data < cur->_data)  
  97.             {  
  98.                 parent = cur;  
  99.                 cur = cur->_left;  
  100.             }  
  101.             else//要麼cur==NULL退出了迴圈,要麼data==cur->_databreak
  102.             {  
  103.                 break;  
  104.             }  
  105.         }  
  106.         if (cur == NULL)  
  107.         {  
  108.             returnfalse;  
  109.         }  
  110.         //1.左為空,或者右為空
  111.         //2.左右都不為空
  112.         if (cur->_left == NULL)  
  113.         {//cur的左為空
  114.             if (parent == NULL)//刪除的是根節點
  115.             {  
  116.                 _root = cur->_right;  
  117.             }  
  118.             

    相關推薦

    LeetCode173. 搜尋迭代器 結題報告 (C++)

    原題地址:https://leetcode-cn.com/problems/binary-search-tree-iterator/description/ 題目描述: 實現一個二叉搜尋樹迭代器。你將使用二叉搜尋樹的根節點初始化迭代器。 呼叫 next() 將返回二叉搜尋樹中的下一個最小

    LeetCode230. 搜尋中第K小的元素 結題報告 (C++)

    原題地址:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/submissions/ 題目描述: 給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。 說明: 你可以假設 k

    LeetCodePython驗證搜尋

    題目給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。一個二叉搜尋樹具有如下特徵:節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1:輸入: 2 / \ 1 3 輸出: true 示

    C++實現搜尋BST

    概念: 二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹),二叉搜尋樹是一種特殊的二叉樹 二叉搜尋樹的性質: 1. 每個節點都有一個作為搜尋依據的關鍵碼

    劍指offerJava實現-搜尋的第k個結點

    題目描述 給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 思路 二叉搜尋樹-BST(又二叉查詢樹,二叉排

    LeetCode 簡單題64-搜尋的最近公共祖先

    宣告: 今天是第64道題。給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:

    劍指Offer23搜尋的後序遍歷序列

    題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 時間限制:1秒;空間限制:32768K 解題思路 BST後序遍歷的特點是: 大小:L樹 < Root <R樹 排序

    資料結構---搜尋BST實現C++)

    1. 二叉查詢樹 二叉查詢樹(Binary Search Tree),也稱為二叉搜尋樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹: 若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值

    LeetCode 簡單題117-搜尋中的眾數

    宣告: 今天是第117道題。給定兩個沒有重複元素的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下一個比其大

    C++滿與完全的區別及判斷

    #include<iostream> #include<queue> using namespace std; struct BinaryTreeNode { char _data; BinaryTreeNode*_left; BinaryTreeNode*_right; Bi

    C++實現搜尋(遞迴&非遞迴)

    二叉搜尋樹(Binary Search Tree)的性質: 1、每個節點都有一個作為搜尋關鍵碼的key,並且所有節點的key都不相同。 2、左子樹上的key值都小於根節點的key值。 3、右子樹上的key值都大於根節點的key值。 4、左右子樹都是二叉搜

    C++實現搜尋排序)模板類

    參考了Weiss的資料結構與演算法分析C++描述第三版 在中文版中,第99頁貌似有個錯誤。在4.3.6 平均情況分析中,書上寫的是“直觀地,我們期望前一節所有的操作特別是makeEmpty 和 operator=都花費O(logN)時間,……”,我感覺不太對,因為make

    C++ 標準模板庫(STL)的 vector 實現搜尋BST

    介紹 眾所周知,要建一棵樹,我們需要關注它的記憶體分配與釋放。為了避開這個問題,我打算用C++ STL(vector和deque)來建一棵小型的BST。很明顯,這篇文章是出於這個想法的。 背景 BST是應用最廣泛的資料結構之一。C是首選語言,不過因為C++尤其是

    C++資料結構——搜尋實現自定義迭代器)

    #ifndef BS_Tree_H #define BS_Tree_H #include"node.h"  #include<iostream> #include<queue> using namespace std; template<typename T>class

    搜尋BST(C語言實現可用)

    1:概述 搜尋樹是一種可以進行插入,搜尋,刪除等操作的資料結構,可以用作字典或優先順序佇列。二叉搜尋樹是最簡單的搜尋樹。其左子樹的鍵值<=根節點的鍵值,右子樹的鍵值>=根節點的鍵值。 如果共有n個元素,那麼每次操作需要的O(log n)的時間.       常用知識

    簡單實現搜尋 (查詢)

    直接看程式碼 /** * @author <a href=mailto:[email protected]>maple</a> * @since 2018-11-25 11:40 PM */ // 二分搜尋樹 // 由於Key需要能夠進行比較,所以需要extends

    java 實現搜尋

    實現程式碼如下: /** * Java 語言: 二叉查詢樹 * * @author skywang * @date 2013/11/07 */ @SuppressWarnings("unused") public class BSTree<T extend

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

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

    C資料結構-搜尋BSTree

    二叉搜尋樹BSTree #ifndef BSTREE_H #define BSTREE_H #ifndef NULL #define NULL 0 #endif /* 元素型別 */ typedef int elem_t; /* 節點結構體 */ typedef struc

    Java 實現搜尋的建立、查詢、插入、刪除結點

    二叉搜尋樹特點:左孩子結點值比當前結點值小,右孩子結點值比當前值大或等於當前值。本文假設樹中的結點值不存在相同的兩項或多項。 一、二叉搜尋樹的建立  1、首先定義結點類     程式碼如下: class TreeNode{ public int iData;