数据结构之二叉树简介

二叉树

二叉树是一种非线性数据结构,代表"祖先"与"后代"之间的派生关系,体现了"一分为二"的分治逻辑。与链表相似,二叉树的基本单元是节点,每个节点包含值,左子节点的索引,右子节点的索引

c++ 复制代码
/* 二叉树节点结构体 */
struct TreeNode {
    int val;          // 节点值
    TreeNode *left;   // 左子节点指针
    TreeNode *right;  // 右子节点指针
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
  • 当给定一个二叉树的节点时,我们将该节点的左子节点及其以下节点形成的树称为该节点的左子树,同理可得,右子节点及其以下节点形成的树称为该节点的右子树。

  • 在给定的二叉树中,除了叶子节点,其他所有节点均包含子节点和非空子树

二叉树的常见术语

  • 根节点:位于二叉树顶层的节点,没有父节点
  • 叶子节点:没有字节的的节点,左右指针均为null
  • 边:连接两个节点的线段,
  • 节点所在的层:从顶到底递增,根节点的层数为1
  • 节点的度:节点的字节点的个数,在二叉树中,节点的度的取值范围:0,1,2
  • 二叉树的高度:从根节点到最远叶子节点所经过的边的数量
  • 节点的深度:从根节点到该节点边的数量
  • 节点的高度:从最远的叶子节点到该节点边的数量

二叉树的基本操作

c++ 复制代码
/* 初始化二叉树 */
// 初始化节点
TreeNode* n1 = new TreeNode(1);
TreeNode* n2 = new TreeNode(2);
TreeNode* n3 = new TreeNode(3);
TreeNode* n4 = new TreeNode(4);
TreeNode* n5 = new TreeNode(5);
// 构建节点之间的引用(指针)
n1->left = n2;
n1->right = n3;
n2->left = n4;
n2->right = n5;
c++ 复制代码
/* 插入与删除节点 */
TreeNode* P = new TreeNode(0);
// 在 n1 -> n2 中间插入节点 P
n1->left = P;
P->left = n2;
// 删除节点 P
n1->left = n2;

常见二叉树的类型

  • 完美二叉树:**所有层的节点都被填满。**所有叶子节点的度为0,其余所有节点的度为2
  • 完全二叉树:只有最底层的节点没有被填满并且最底层的节点靠左填满
  • 完满二叉树:除了叶子节点外,其余所有节点的度为2
  • 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过1
相关推荐
CS创新实验室11 小时前
从顺序表到动态数组:数据结构的永恒基石与现代语言的优雅封装
数据结构·算法
8Qi812 小时前
LeetCode 23. 合并 K 个升序链表 —— 小顶堆(PriorityQueue)
数据结构·算法·leetcode·链表·
QiLinkOS13 小时前
《打破“用爱发电”:一种基于 Gitee 与时间戳的开源权益分配机制探索》
c语言·数据结构·c++·科技·算法·gitee·开源
Boom_Shu15 小时前
长方形的关系
数据结构·c++·算法
Lsk_Smion16 小时前
力扣实训 _ [543].二叉树的直径 _ [23].合并K个升序列表
数据结构·算法·leetcode
ID_1800790547318 小时前
淘宝商品详情数据接口深度解析:架构、鉴权、数据结构与实战
数据结构·架构
散峰而望19 小时前
【算法练习】算法练习精选:陶陶摘苹果(基础+升级)、Music Notes、字串变换,你能AC几道?
数据结构·c++·算法·leetcode·贪心算法·github·动态规划
凤凰院凶涛QAQ19 小时前
《Java版数据结构 & 集合类剖析》集合框架的封装设计与顺序表:“从 Iterable 到 ArrayList:集合框架的‘职业树“
java·开发语言·数据结构
8Qi819 小时前
LeetCode 148. 排序链表 —— 解法一:自顶向下递归(分治 + 归并)
数据结构·算法·leetcode·链表·递归·分治·归并
8Qi820 小时前
LeetCode 148. 排序链表 —— 解法二:自底向上归并(迭代,O(1) 空间)
数据结构·算法·leetcode·链表·归并·迭代