当前位置: 首页 > web >正文

深入剖析二叉树家族:二叉树、平衡二叉树、满二叉树与搜索二叉树

本文介绍从简单的二叉树到具有特殊性质的平衡二叉树、满二叉树和搜索二叉树,它们各自拥有独特的特点和广泛的应用场景。

一、二叉树

1. 定义

二叉树是一种树形数据结构,其每个节点最多拥有两个子节点,分别称作左子节点和右子节点。二叉树可以为空,仅含一个根节点,或者由根节点和左右子树构成,且左右子树同样为二叉树。

2. 特点

节点的度(子节点数量)不超过 2。

左右子树具有顺序,不可随意交换。

3. 实现

#include <iostream>// 定义二叉树节点
struct TreeNode {int value;TreeNode* left;TreeNode* right;TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};// 示例:创建一个简单的二叉树
int main() {TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);// 后续可以进行更多操作,这里简单释放内存delete root->left;delete root->right;delete root;return 0;
}    

4. 应用

可用于表示具有层次结构的数据,如文件系统的目录结构。

在编译器中,用于构建语法分析树。

二、平衡二叉树(AVL 树)

1. 定义

平衡二叉树,即 AVL 树,是一种自平衡的二叉搜索树。在 AVL 树中,每个节点的左右子树的高度差的绝对值不超过 1,且左右子树也都是平衡二叉树。

2. 特点

能确保树的高度始终维持在O(\log_{2}n)级别,使得插入、删除和查找操作的时间复杂度均为 O(\log_{2}n)

通过旋转操作(左旋、右旋、左右旋、右左旋)来维持树的平衡。

3. 实现

#include <iostream>// 定义 AVL 树节点
struct AVLTreeNode {int value;int height;AVLTreeNode* left;AVLTreeNode* right;AVLTreeNode(int val) : value(val), height(1), left(nullptr), right(nullptr) {}
};// 获取节点高度
int getHeight(AVLTreeNode* node) {return node ? node->height : 0;
}// 获取平衡因子
int getBalance(AVLTreeNode* node) {return node ? getHeight(node->left) - getHeight(node->right) : 0;
}// 右旋操作
AVLTreeNode* rightRotate(AVLTreeNode* y) {AVLTreeNode* x = y->left;AVLTreeNode* T2 = x->right;x->right = y;y->left = T2;y->height = std::max(getHeight(y->left), getHeight(y->right)) + 1;x->height = std::max(getHeight(x->left), getHeight(x->right)) + 1;return x;
}// 左旋操作
AVLTreeNode* leftRotate(AVLTreeNode* x) {AVLTreeNode* y = x->right;AVLTreeNode* T2 = y->left;y->left = x;x->right = T2;x->height = std::max(getHeight(x->left), getHeight(x->right)) + 1;y->height = std::max(getHeight(y->left), getHeight(y->right)) + 1;return y;
}// 插入节点
AVLTreeNode* insert(AVLTreeNode* node, int value) {if (!node) return new AVLTreeNode(value);if (value < node->value)node->left = insert(node->left, value);else if (value > node->value)node->right = insert(node->right, value);elsereturn node;node->height = 1 + std::max(getHeight(node->left), getHeight(node->right));int balance = getBalance(node);// 左左情况if (balance > 1 && value < node->left->value)return rightRotate(node);// 右右情况if (balance < -1 && value > node->right->value)return leftRotate(node);// 左右情况if (balance > 1 && value > node->left->value) {node->left = leftRotate(node->left);return rightRotate(node);}// 右左情况if (balance < -1 && value < node->right->value) {node->right = rightRotate(node->right);return leftRotate(node);}return node;
}// 中序遍历
void inorder(AVLTreeNode* root) {if (root) {inorder(root->left);std::cout << root->value << " ";inorder(root->right);}
}int main() {AVLTreeNode* root = nullptr;root = insert(root, 10);root = insert(root, 20);root = insert(root, 30);root = insert(root, 40);root = insert(root, 50);root = insert(root, 25);std::cout << "Inorder traversal of the AVL tree: ";inorder(root);std::cout << std::endl;return 0;
}    

4. 应用

数据库索引:在需要频繁进行插入、删除和查找操作的数据库中,能保证高效的性能。

搜索引擎:用于快速查找和排序数据。

三、满二叉树

1. 定义

满二叉树是一种特殊的二叉树,其中每个内部节点(非叶子节点)都有两个子节点,并且所有叶子节点都处于同一层。

2. 特点

节点总数为 2^{h}-1,其中 h 为树的高度。

3. 实现

#include <iostream>
#include <cmath>// 定义二叉树节点
struct TreeNode {int value;TreeNode* left;TreeNode* right;TreeNode(int val) : value(val), left(nullptr), right(nullptr) {}
};// 检查是否为满二叉树
bool isFullBinaryTree(TreeNode* root) {if (!root) return true;if (!root->left && !root->right) return true;if (root->left && root->right)return isFullBinaryTree(root->left) && isFullBinaryTree(root->right);return false;
}// 计算树的高度
int treeHeight(TreeNode* root) {if (!root) return 0;return 1 + std::max(treeHeight(root->left), treeHeight(root->right));
}// 检查节点总数是否符合满二叉树的要求
bool isFull(TreeNode* root) {int h = treeHeight(root);int nodes = std::pow(2, h) - 1;return isFullBinaryTree(root) && nodes == std::pow(2, h) - 1;
}int main() {TreeNode* root = new TreeNode(1);root->left = new TreeNode(2);root->right = new TreeNode(3);root->left->left = new TreeNode(4);root->left->right = new TreeNode(5);root->right->left = new TreeNode(6);root->right->right = new TreeNode(7);if (isFull(root))std::cout << "The tree is a full binary tree." << std::endl;elsestd::cout << "The tree is not a full binary tree." << std::endl;return 0;
}    

4. 应用

在一些算法中,满二叉树的规则结构可以简化计算和分析。

用于构建完全二叉堆等数据结构。

四、搜索二叉树(二叉搜索树)

1. 定义

搜索二叉树(Binary Search Tree,BST)是一种二叉树,对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。

2. 特点

中序遍历搜索二叉树可以得到一个有序的序列。

插入、删除和查找操作的平均时间复杂度为 O(\log_{2}n),但在最坏情况下(树退化为链表)时间复杂度为 O(n)

3. 实现

#include <iostream>// 定义二叉搜索树节点
struct BSTNode {int value;BSTNode* left;BSTNode* right;BSTNode(int val) : value(val), left(nullptr), right(nullptr) {}
};// 插入节点
BSTNode* insert(BSTNode* root, int value) {if (!root) return new BSTNode(value);if (value < root->value)root->left = insert(root->left, value);else if (value > root->value)root->right = insert(root->right, value);return root;
}// 中序遍历
void inorder(BSTNode* root) {if (root) {inorder(root->left);std::cout << root->value << " ";inorder(root->right);}
}// 查找节点
bool search(BSTNode* root, int value) {if (!root) return false;if (root->value == value) return true;if (value < root->value)return search(root->left, value);elsereturn search(root->right, value);
}int main() {BSTNode* root = nullptr;root = insert(root, 50);insert(root, 30);insert(root, 20);insert(root, 40);insert(root, 70);insert(root, 60);insert(root, 80);std::cout << "Inorder traversal of the BST: ";inorder(root);std::cout << std::endl;int key = 60;if (search(root, key))std::cout << key << " found in the BST." << std::endl;elsestd::cout << key << " not found in the BST." << std::endl;return 0;
}    

4. 应用

用于实现动态集合,如字典和集合。

在数据库系统中,用于快速查找和排序数据。

http://www.xdnf.cn/news/2773.html

相关文章:

  • 系统架构-软件可靠性
  • 【前端】1h 搞定 TypeScript 教程_只说重点
  • RK3576遇到的坑
  • 基于RSSI原理的Wi-Fi定位程序,N个锚点(数量可自适应)、三维空间,轨迹使用CKF进行滤波,附完整的代码,可复制粘贴
  • 将有序数组转换为高度平衡二叉搜索树 | 详解与Java实现
  • 第11章 安全网络架构和组件(二)
  • 《Astro 3.0岛屿架构让内容网站“脱胎换骨”》
  • 基于 Spring Boot 瑞吉外卖系统开发(八)
  • 如何实现Redis和Mysql中数据双写一致性
  • Golang|工厂模式
  • nigx屏蔽无用爬虫
  • 【数据可视化-42】杂货库存数据集可视化分析
  • C 语言函数指针与指针函数详解
  • 轻舟系列FPGA加速卡:大模型分布式训练中的高效协同者
  • 因特网和万维网
  • 下载同时返回其他参数
  • 数据分析1
  • Python 3如何用pygetwindow包将指定窗口顶到最上层(激活窗口)
  • MuJoCo 仿真注意事项
  • Deepseek-v3+cline+vscode java自动化编程
  • C语言指针
  • 2015, JLink,下载安装步骤
  • AI技术落地实战指南:从核心突破到产业赋能
  • iPhone闹钟无法识别调休致用户迟到,苹果客服称会记录反馈
  • Boost 库安装 (windows 11)
  • 【LLM模型开发】WordPiece算法
  • QT6 源(58)篇一:阅读与注释 QString 这个类,先给出其应用举例
  • OpenCV VC编译版本
  • iView Table 组件跨页选择功能实现文档
  • 4月28日日记