4 二叉查找树(BST树)、平衡二叉树(AVL树)
4.1 二叉查找树(BST树)
二叉查找树(Binary Search Tree, BST),又被称为二叉搜索树
4.1.1 特点
(1)若节点的左子树不空, 则左子树上所有节点的key均小于它的根节点的key
(2)若节点的右子树不空, 则右子树上所有节点的key均大于它的根节点的key
(3)任意节点的左,右子树也分别为二叉查找树
(4)没有key相等的节点
二叉查找树进行中序遍历,可以得到一个递增的有序序列
- 实例
#include <iostream>
using namespace std;
class Node{
public:
char val;
Node* left;
Node* right;
Node(char val):val(val),left(nullptr),right(nullptr){
}
Node(char val,Node* left,Node* right):val(val),left(left),right(right){
}
};
class BSTtree{
private:
Node* m_root = nullptr;
void inorder(Node* root){
if(nullptr == root) return;
inorder(root->left);
cout << root->val << " ";
inorder(root->right);
}
Node* Insert(Node* root,char val){
if(nullptr == root) return new Node(val);
if(root->val > val){
root->left = Insert(root->left,val);
}else{
root->right = Insert(root->right,val);
}
return root;
}
public:
void Insert(char val){
m_root = Insert(m_root,val);
}
void Print(){
inorder(m_root);//二叉查找树进行中序遍历,可以得到一个递增的有序序列
cout << endl;
}
};
int main(){
BSTtree root;
root.Insert('T');
root.Insert('E');
root.Insert('B');
root.Insert('F');
root.Insert('Y');
root.Insert('X');
root.Insert('Z');
root.Print();
}
树的结构:
结果:B E F T X Y Z
分析:递增序列
4.1.2 结构
二叉搜索树通常使用链式存储孩子表示法。
class Node{
public:
char val;
Node* left;
Node* right;
Node(char val):val(val),left(nullptr),right(nullptr){
}
Node(char val,Node* left,Node* right):val(val),left(left),right(right){
}
};
4.1.3 操作(插入、查找和删除)
4.1.3.1 插入
- 步骤
(1)如果二叉查找树为空,则直接插入。
(2)如果插入节点key小于根结点key,则插入到左子树中;大于根结点key,则插入到右子树中。
(3)依次类推,直到找到插入位置。
- 实例
#include <iostream>
using namespace std;
template <typename T>
class _Node{
public:
T val;
_Node* left;
_Node* right;
_Node(T val):val(val),left(nullptr),right(nullptr){
}
_Node(T val,_Node* left,_Node* right):val(val),left(left),right(right){
}
};
template <typename T>
class BSTtree{
private:
typedef _Node<T> Node;
Node* m_root = nullptr;
void inorder(Node* root){
if(nullptr == root) return;
inorder(root->left);
cout << root->val << " ";
inorder(root->right);
}
void preorder(const Node* root){
if(nullptr == root) return;
if(root->left) cout << root->val << "--" << root->left->val << endl;
if(root->right) cout << root->val << "--" << root->right->val << endl;
preorder(root->left);
preorder(root->right);
}
Node* Insert(Node* root,T val){
if(nullptr == root) return new Node(val);
if(root->val > val){
root->left = Insert(root->left,val);
}else{
root->right = Insert(root->right,val);
}
return root;
}
public:
void Insert(T val){
if(Search(val)) return;
m_root = Insert(m_root,val);
}
void Print(){
inorder(m_root);//二叉查找树进行中序遍历,可以得到一个递增的有序序列
cout << endl;
preorder(m_root);
}
};
int main(){
BSTtree<int> root;
root.Insert(15);
root.Insert(4);
root.Insert(20);
root.Insert(17);
root.Insert(19);
root