首页 > 其他分享 >基本概念:(Binary Tree)

基本概念:(Binary Tree)

时间:2024-09-01 10:27:08浏览次数:9  
标签:左子 Binary 遍历 递归 右子 Tree 节点 二叉树 基本概念

基本概念
"二叉树"(Binary Tree)这个名称的由来是因为二叉树的每个节点最多有两个子节点,一个左子节点和一个右子节点。其中,“二叉”指的是两个,因此“二叉树”表示每个节点最多可以分支成两个子节点。基本定义:

每个节点包含一个值(或数据),另外最多有两个子节点。
左子节点和右子节点的顺序是固定的,左边的子节点是左子节点,右边的子节点是右子节点。
一个节点可以没有子节点(叶节点),也可以有一个子节点或两个子节点(内部节点)。

相关基本概念:

根节点(Root): 二叉树的顶部节点称为根节点,是树的起始点。
节点(Node): 二叉树的基本构建单元。每个节点包含一个值(或数据)以及指向左子节点和右子节点的指针。
父节点(Parent Node): 一个节点的直接上级节点,如果存在的话。例如,一个节点的左子节点的父节点是该节点本身。
叶节点(Leaf Node): 没有子节点的节点称为叶节点,即左子节点和右子节点都为空。
子树(Subtree): 以某个节点为根的树,它包括该节点及其所有后代节点。
高度(Height): 从某个节点到其最远叶节点的最长路径上的边数,也称为节点的层数。叶节点的高度为0。
在二叉树基本定义上,加上一些规则,可以衍生出更多种类的二叉树。比如:

二叉搜索树(Binary Search Tree,BST): 一种特殊的二叉树,满足以下性质:对于树中的每个节点,其左子树中的值都小于该节点的值,而其右子树中的值都大于该节点的值。BST通常用于实现有序数据集合。

完全二叉树(Complete Binary Tree): 一个二叉树,其所有层次(深度)除了最后一层外,都是完全填充的,且最后一层的节点从左到右填充,没有空隙。

平衡二叉树(Balanced Binary Tree): 一种高度平衡的二叉树,其中每个节点的两棵子树的高度差不超过1。平衡二叉树通常用于提高查找、插入和删除操作的性能。

预备基础算法 —— 递归(Recursion)
下一部分要写的是二叉树基本遍历代码实现其实可以有多种,思量后用递归实现应该是初接触者比较简洁好理解的方式。为此,在写二叉树下一部分内容之前简单写下基础递归算法,以保证本系列文章承前启后。

递归(Recursion),在数学与计算机科学中对其描述的说法有很多,比如:

指在函数的定义中使用函数自身的方法;
指一种通过重复将问题分解为同类的子问题而解决问题的方法;
(PS:这里同类子问题对于于上一种说法就是函数自身)
指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
(PS:这里描述的基本情况对应于第一种说法中的函数自身了)
当然本文非学术著作"哪种描述比较合适"在此不多做分析,从编码实践的角度第一种说法更为地气一点。

“将问题分解为同类的子问题” 这一点是用递归的方式来解题的关键,这里用个简单的累加和的例子:

设计一个函数,输入参数为 n ,返回 1+2+...n 的和。

public int sum(int n){
int result = 0;
for (int i = 1; i <= n ; i++) {
result = result + i;
}
return result;
}
想想初学 C 语言for循环的时候应该都有写过上述代码,从 1开始递增加到 n 这其实是典型的递推。那如果用递归的思路来思考的话:
//代码效果参考:https://www.h3cw.com/sitemap/post.html
求 1+2+..n 的和(问题) -> 就是 n 加上 求 1+2+..(n-1) 的和(同类的子问题);
其中最基本的情况 1 的和 为 1。

public int sum( int n ) {
if( 1 == n) return 1;
return n + sum(n-1);
}
可以看到递归的代码实现上是不是非常简洁。大部分初学者思考上比较习惯于递推,如果第一次接触递归角度思考会有些不适应(或者无法独立分析出来递归)也是正常。当慢慢熟悉后,会发现用递归的思路解决某些算法问题往往会非常简单(在本篇接下来的内容中就能发现这点)。

在 初学递归 过度到 熟悉递归 这个阶段,笔者建议可以考虑把一些用递推已经解决了的问题 用 递归的思路尝试解决,习惯递归思路后会打开一片新世界。

基本遍历(Traversal)
二叉树的遍历是指按照一定的顺序访问二叉树的所有节点。在二叉树中,有三种常见的遍历方式,它们分别是前序遍历、中序遍历和后序遍历。

先序遍历(Preorder Traversal)
从根节点开始,首先访问根节点,然后按照前序遍历的方式依次访问左子树和右子树。前序遍历通常用于复制一棵树或计算表达式的值。

访问顺序:根节点 -> 左子树 -> 右子树

Leetcode 144. 二叉树的前序遍历【简单】
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

中序遍历(Inorder Traversal)
从根节点开始,首先按照中序遍历的方式访问左子树,然后访问根节点,最后访问右子树。中序遍历通常用于访问二叉搜索树中的节点,以升序或降序访问节点值。

访问顺序:左子树 -> 根节点 -> 右子树

Leetcode 94. 二叉树的中遍历【简单】
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

针对后序遍历(Postorder Traversal)从根节点开始,首先按照后序遍历的方式访问左子树,然后访问右子树,最后访问根节点。后序遍历通常用于释放二叉树的内存,或计算表达式的值。访问顺序:左子树 -> 右子树 -> 根节点,在此不过多描述相信一定能够完成编码。

反向构建
Leetcode 105. 从前序与中序遍历序列构造二叉树【中等】
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

综合应用
本系列文章中已经介绍了链表、递归、二叉树,解决算法问题往往会需要综合应用。不妨来看下下面这个问题:

Leetcode 114. 二叉树展开为链表【中等】
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。

总结下
介绍了二叉树的的一些基本概念包括:根节点、叶子节点、高度等等;
介绍了基础算法递归的思想:“重复将问题分解为同类的子问题而解决问题的方法”;
介绍了基本的二叉树遍历 和 反向构建的相关思路;
结合本系列先前文章内容,解决综合链表、递归、二叉树的问题,灵活处理使用数据结构的特征是关键。

标签:左子,Binary,遍历,递归,右子,Tree,节点,二叉树,基本概念
From: https://www.cnblogs.com/longshao2024/p/18391062

相关文章

  • 【机器学习】聚类算法的基本概念和实例代码以及局部度量学习的概念和实例代码
    引言聚类算法在许多领域都有广泛的应用,例如数据挖掘、生物信息学、图像处理等。文章目录引言一、聚类算法1.1K-Means算法1.2DBSCAN算法1.3层次聚类(HierarchicalClustering)算法1.4高斯混合模型(GaussianMixtureModel,GMM)1.5谱聚类(SpectralClustering)算法1.6基......
  • 【机器学习】K近邻(K-Nearest Neighbors,简称KNN)的基本概念以及消极方法和积极方法的区
    引言K近邻(K-NearestNeighbors,简称KNN)算法是一种基础的机器学习方法,属于监督学习范畴文章目录引言一、K近邻(K-NearestNeighbors,简称KNN)1.1原理详述1.1.1距离度量1.1.2选择k值1.1.3投票机制1.2实现步骤1.3参数选择1.4应用场景1.5优缺点1.5.1优点1.5.2缺点......
  • 题解:CF916B Jamie and Binary Sequence (changed after round)
    题意把一个数分解成恰好\(k\)个\(2^{a_i}\)次方的和,可以重复,要求保证最大的\(a_i\)要尽可能的小时,\(a\)的字典序尽可能大,输出序列\(a\)。分析首先我们借助二进制拆出一个满足\(n=\sum2^{a_i}\)序列\(a\),满足\(a\)的长度最小。若此时\(a\)的长度大于\(k\),显......
  • MySQL索引底层结构为什么用B+Tree?
    索引为何不选择二叉树?二叉搜索树是遵守二分搜索法实现的一种数据结构,它具有下面特点:任意节点的左节点不为空时,左节点值小于根节点值;右节点不为空时,右节点值大于根节点值;依次存入数据,如果数据是递增的,则原二叉树退化为链表结构 从动画中可以明显看到,需要经过5次查询才能......
  • P10013 [集训队互测 2023] Tree Topological Order Counting
    Description给定一颗\(n\)个点的有根树,\(1\)是根,记\(u\)的父亲是\(fa_u\)。另给出一长度为\(n\)的权值序列\(b\)。称一个长度为\(n\)的排列\(a\)为这颗树的合法拓扑序,当且仅当\(\forall2\leu\len,a_u>a_{fa_u}\)。对每个点\(u\),定义\(f(u)\)为,在所有这......
  • Spark MLlib模型训练—回归算法 Decision tree regression
    SparkMLlib模型训练—回归算法Decisiontreeregression在机器学习中,决策树是一种常用且直观的模型,广泛应用于分类和回归任务。决策树回归(DecisionTreeRegression)通过将数据集分割成多个区域,构建一棵树形结构,以预测目标变量的连续值。本文将详细探讨Spark中的决......
  • AT cf17 final J Tree MST
    ATcf17finalJTreeMST考场上想出的黑题,然而写挂了……思路考场推出boruvka算法,会的直接跳过就好。结论:一个点向另外一个点连出的最小边,一定在最小生成树上。证明:参考Kruskal生成树的流程,若当前边(最小边)不在最小生成树上,表明边的两端已经在同一个连通块中。那么存在一......
  • 【数据结构与算法第二章(理论知识)】绪论:数据结构的定义、算法的基本概念和算法效率分析
     目录【数据结构与算法第二章(理论知识)】绪论1.1数据结构的定义1.2算法的基本概念1.3算法效率分析1.3.1时间复杂度1.3.2空间复杂度【数据结构与算法第二章(理论知识)】绪论1.1数据结构的定义    数据结构没有一个统一的官方定义,以下是一些经典书籍对数据......
  • C++学习随笔——C++STL中binary_search的使用方法
    std::binary_search是C++标准模板库(STL)中的一个算法,用于在有序范围内查找某个值是否存在。它基于二分查找算法,时间复杂度为O(logn)。std::binary_search的基本用法:  boolbinary_search(ForwardIteratorfirst,ForwardIteratorlast,constT&value);first:指......
  • 面试中的SEO优化:从基本概念到实用策略
    前言为什么要学习SEOSEO对于Web站点很重要,有助于优化网页在搜索引擎中的排名,提升网站可见性和流量。掌握SEO技术可以确保网页结构和内容对搜索引擎友好,从而提高用户访问量和用户体验。而且SEO被面试问的很多SEO是什么?SEO(SearchEngineOptimization,搜索引擎优化)是优......