【C++】實現的二叉搜尋樹BST
概念:
二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹),二叉搜尋樹是一種特殊的二叉樹
二叉搜尋樹的性質:
1. 每個節點都有一個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。
2. 左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。
3. 右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼(key)。
4. 左右子樹都是二叉搜尋樹。
程式碼:(程式碼中間包含了對基本功能(插入,刪除,查詢)的遞迴和非遞迴的實現)
- <span style="font-size:18px;">include <iostream>
- #include <string>
- usingnamespace std;
- template<class K,class V>
- struct BSTreeNode
- {
- K _data; //值
- V _freq; //出現的頻率
-
BSTreeNode<K, V>* _left; //指向左子樹的指標
- BSTreeNode<K, V>* _right; //指向右子樹的指標
- BSTreeNode(const K& data, const V& freq)//初始化
- :_data(data)
- , _freq(freq)
- , _left(NULL)
- , _right(NULL)
- {}
- };
- template<class K, class V>
- struct BSTree
- {
-
typedef BSTreeNode<K, V> Node;
- public:
- BSTree()//初始化
- :_root(NULL)
- {}
- //插入
- bool Insert(const K& data, const V& freq)
- {
- if (_root == NULL)//如果節點為空,就在此節點處加入data資料
- {
- _root = new Node(data, freq);
- returntrue;
- }
- Node* parent = NULL;
- Node* cur = _root;
- while (cur)//搜尋data應該插入的節點:parent節點後
- {
- if (data > cur->_data)//如果data大於節點的值,就繼續在節點的右子樹中插入data
- {
- parent = cur;
- cur = cur->_right;
- }
- elseif (data < cur->_data)//如果data小於節點的值,就繼續在節點的左子樹中插入data
- {
- parent = cur;
- cur = cur->_left;
- }
- else
- {
- cur->_freq++;
- returntrue;
- }
- }
- //在parent節點後插入data
- if (data > parent->_data)
- {
- parent->_right = new Node(data, freq);
- }
- else
- {
- parent->_left = new Node(data, freq);
- }
- returntrue;
- }
- Node* Find(const K& data)//查詢
- {
- Node* cur = _root;
- while (cur)
- {
- if (data >cur->_data)//若data大於當前節點,則在當前節點的右子樹中查詢
- {
- cur = cur->_right;
- }
- elseif (data < cur->_data)//若data小於當前節點,則在當前節點的左子樹中查詢
- {
- cur = cur->_left;
- }
- else
- {
- return cur;
- }
- }
- return NULL;
- }
- bool Remove(const K& data)//刪除
- {
- Node* parent = NULL;
- Node* cur = _root;
- while (cur)//尋找data節點cur
- {
- if (data > cur->_data)
- {
- parent = cur;
- cur = cur->_right;
- }
- elseif (data < cur->_data)
- {
- parent = cur;
- cur = cur->_left;
- }
- else//要麼cur==NULL退出了迴圈,要麼data==cur->_databreak
- {
- break;
- }
- }
- if (cur == NULL)
- {
- returnfalse;
- }
- //1.左為空,或者右為空
- //2.左右都不為空
- if (cur->_left == NULL)
- {//cur的左為空
- if (parent == NULL)//刪除的是根節點
- {
- _root = cur->_right;
- }
-
相關推薦
【LeetCode】173. 二叉搜尋樹迭代器 結題報告 (C++)
原題地址:https://leetcode-cn.com/problems/binary-search-tree-iterator/description/ 題目描述: 實現一個二叉搜尋樹迭代器。你將使用二叉搜尋樹的根節點初始化迭代器。 呼叫 next() 將返回二叉搜尋樹中的下一個最小
【LeetCode】230. 二叉搜尋樹中第K小的元素 結題報告 (C++)
原題地址:https://leetcode-cn.com/problems/kth-smallest-element-in-a-bst/submissions/ 題目描述: 給定一個二叉搜尋樹,編寫一個函式 kthSmallest 來查詢其中第 k 個最小的元素。 說明: 你可以假設 k
【LeetCode】【Python】驗證二叉搜尋樹
題目給定一個二叉樹,判斷其是否是一個有效的二叉搜尋樹。一個二叉搜尋樹具有如下特徵:節點的左子樹只包含小於當前節點的數。節點的右子樹只包含大於當前節點的數。所有左子樹和右子樹自身必須也是二叉搜尋樹。示例 1:輸入: 2 / \ 1 3 輸出: true 示
【C++】實現的二叉搜尋樹BST
概念: 二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹),二叉搜尋樹是一種特殊的二叉樹 二叉搜尋樹的性質: 1. 每個節點都有一個作為搜尋依據的關鍵碼
【劍指offer】Java實現-二叉搜尋樹的第k個結點
題目描述 給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。 思路 二叉搜尋樹-BST(又二叉查詢樹,二叉排
【LeetCode 簡單題】64-二叉搜尋樹的最近公共祖先
宣告: 今天是第64道題。給定一個二叉搜尋樹, 找到該樹中兩個指定節點的最近公共祖先。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除 (手動比心ღ( ´・ᴗ・` )) 正文 題目:
【劍指Offer】23二叉搜尋樹的後序遍歷序列
題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出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;