二叉查找树(二叉搜索树)
2017-04-23 20:40
113 查看
二叉查找树,对于树的每个节点X,它的左子树中的所有关键字值小于X的关键字值,而它的右子树所有关键字值大于X的关键字值。如图,左边是二叉查找树,右边不是。
有以下特性:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
![](https://img-blog.csdn.net/20170423161956367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM3NzIwMTcy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二叉查找树比较麻烦的操作是删除。分别有三种情况:
1.删除节点为子叶,这个直接删除即可。
2.删除节点存在左子树或者右子树,那么直接令这个左子树或者右子树成为该节点的双亲节点的左子树或者右子树。
3.删除节点同时存在左右子树,那么为了保持二叉树的特性,我们必须在其右子树中找到关键字值最小的节点来替代删除的节点。
特点:在二叉查找树中,大部分操作为O(logN).
![](https://img-blog.csdn.net/20170423202323660?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2VpeGluXzM3NzIwMTcy/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
有以下特性:
(1)若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
二叉查找树比较麻烦的操作是删除。分别有三种情况:
1.删除节点为子叶,这个直接删除即可。
2.删除节点存在左子树或者右子树,那么直接令这个左子树或者右子树成为该节点的双亲节点的左子树或者右子树。
3.删除节点同时存在左右子树,那么为了保持二叉树的特性,我们必须在其右子树中找到关键字值最小的节点来替代删除的节点。
特点:在二叉查找树中,大部分操作为O(logN).
#pragma once #include<iostream> using namespace std; template<typename T> struct Node { T _date; Node<T> *_left; Node<T> *_right; }; template<typename T> class Bi_Sch_Tree { typedef struct Node<T> *PtrNode; public: Bi_Sch_Tree():T(NULL){} ~Bi_Sch_Tree() { MakeEmpty(T); } void Create(const int *arr, int length) { for (int i = 0; i < length; ++i) T = Insert(arr[i], T); } PtrNode MakeEmpty(PtrNode root) { if (root) { MakeEmpty(root->_left); MakeEmpty(root->_right); free(root); } return NULL; } PtrNode Find(T x, PtrNode root) { if (!root) return NULL; if (x < root->_date) return Find(x, root->_left); else if (x > root->_date) return Find(x, root->_right); else return root; } PtrNode FindMin(PtrNode root) { if (!root) return NULL; if (!root->_left) return root; return FindMin(root->_left); } PtrNode FindMax(PtrNode root) { if (!root) return NULL; PtrNode p = root; while (p->_right) p = p->_right; return p; } PtrNode Insert(T x, PtrNode root) { if (!root) { if (!(root = (PtrNode)malloc(sizeof(Node<int>)))) cout << "MALLOC FAIL!" << endl; else { root->_date = x; root->_right = root->_left = NULL; } } else if (x < root->_date) root->_left = Insert(x, root->_left); else if (x > root->_date) root->_right = Insert(x, root->_right); return root; } PtrNode Delete(T x, PtrNode root) { PtrNode TmpNode; if (!root) return NULL; else if (x < root->_date) root->_left = Delete(x, root->_left); else if (x > root->_date) root->_right = Delete(x, root->_right); /*左右子树都存在的情况下,右子树最小值替代被删除的的元素*/ else if (root->_left&&root->_right) { TmpNode = FindMin(root->_right); root->_date = TmpNode->_date; root->_right = Delete(TmpNode->_date, root->_right); } /*当存在一个子树时*/ else { TmpNode = root; if (root->_left) root = root->_left; else root = root->_right; delete TmpNode; } return root; } void Pre_Traverse(PtrNode root) { if (root) { cout << root->_date << " "; Pre_Traverse(root->_left); Pre_Traverse(root->_right); } } PtrNode Get_Root() { return T; } private: PtrNode T; };
#include"BinarySearchTree.h" void main() { int arr[7] = { 6,2,1,5,3,4,8 }; Bi_Sch_Tree<int> tree; tree.Create(arr, 7); Node<int> *p = tree.Get_Root(); cout << "Min:" << tree.FindMin(p)->_date << endl; cout << "Max:" << tree.FindMax(p)->_date << endl; tree.Pre_Traverse(p); cout << endl; tree.Delete(2, p); tree.Pre_Traverse(p); system("pause"); }
相关文章推荐
- [二叉查找树] 二叉搜索树
- [BinaryTree] 二叉搜索树(二叉查找树、二叉排序树)
- 二叉搜索树;二叉查找树;二叉排序树;binary search tree(BST)
- 数据结构与算法分析--二叉排序树(二叉查找树,二叉搜索树)的查找、插入和删除操作
- 二叉搜索树(二叉排序树,二叉查找树,二叉检索树)的查找,插入,删除
- 二叉搜索树(二叉查找树、二叉排序树)及其实现
- [LintCode]95.验证二叉查找树(二叉排序树/二叉搜索树) 中序遍历
- 二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++
- 二叉排序树(Binary Sort Tree,二叉查找树,二叉搜索树)--【算法导论】
- 二叉搜索树(二叉查找树,二叉排序树)
- 二叉搜索树;二叉查找树;二叉排序树;binary search tree
- 二叉搜索树(二叉查找树,二叉排序树)的详细实现
- 树之二叉查找树(二叉搜索树)
- 二叉查找树/二叉排序树/二叉搜索树----> BST
- 二叉排序树 二叉查找树 二叉搜索树
- 二叉搜索树(二叉排序树,二叉查找树)BST
- ※数据结构※→☆非线性结构(tree)☆============二叉搜索树(二叉查找树) 顺序存储结构(tree Binary Search sequence)(二十四)
- 二叉搜索树;二叉查找树;二叉排序树;Binary Search Tree
- 树学习 --------- 二叉查找树/二叉搜索树(Binary Sort Tree)
- 【算法设计-二叉搜索树】二叉查找树的操作与实现