四、高级数据结构和算法:二叉搜索树(BST树)、平衡二叉树(AVL树)

本文详细介绍了二叉查找树(BST)的基础概念,包括其特点、插入、查找和删除操作,以及如何通过旋转处理不平衡。重点转向平衡二叉树(AVL树),阐述了其平衡条件、插入和删除的复杂性及旋转操作,对比了BST与AVL的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值