经典编程题——二叉树与树
文章平均质量分 79
记录了个人的学习过程,总结了一些经典的二叉树编程题目,并附上了自己的思路代码等,个人认为比较清晰基础,若有错误望指正。
薛定谔的猫ovo
每一个优秀的人,都有一段沉默的时光。
展开
-
线索二叉树的基本概念
文章目录线索二叉树的基本概念线索二叉树的构造线索二叉树的基本概念在二叉树的学习中,我们知道,在有nnn个结点的二叉树中,有n−1n-1n−1个空指针。这是因为每个叶结点有2个空指针,而每个度为1的结点有1个空指针,总的空指针数为2n0+n12n_0+n_12n0+n1,又n0=n2+1n_0=n_2+1n0=n2+1,所以总的空指针数为n0+n1+n2+1=n+1n_0+n_1+n_2+1=n+1n0+n1+n2+1=n+1。为此,可以改造二叉树的结点,在结点的空指针域中存放该结点在某原创 2021-12-02 16:17:23 · 919 阅读 · 0 评论 -
堆的定义及其基本操作(存储、建立、插入、删除)
文章目录堆的定义堆的存储堆的建立建立小根堆建立大根堆堆的插入小根堆的插入大根堆的插入堆的删除小根堆的删除大根堆的删除说明堆的定义堆的定义如下:nnn个关键字序列L[1...n]L[1...n]L[1...n]称为堆,当且仅当该序列满足:L[i]≤L[2i]L[i]≤L[2i]L[i]≤L[2i] 且 L[i]≤L[2i+1]L[i]≤L[2i+1]L[i]≤L[2i+1] (小根堆)或者 L[i]≥L[2i]L[i]≥L[2i]L[i]≥L[2i] 且 L[i]≥L[2i]L[i]≥L[2i]L原创 2021-11-26 18:16:34 · 1836 阅读 · 3 评论 -
树的应用——并查集及实现代码
文章目录什么是并查集亲戚问题并查集的实现改进——路径压缩并查集的用途什么是并查集 并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。常常在使用中以森林来表示。 并查集支持以下3种操作:初始化(Initial):将集合中的每个元素初始化为只有一个单元素的子集合。合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合中。这样来说还是有点抽象,所以先来看看并查集最直接的一个应用场景:亲戚问题。亲戚问原创 2021-11-06 16:30:02 · 305 阅读 · 0 评论 -
二叉树的带权路径长度WPL算法实现
文章目录题目描述算法思想实现代码题目描述 二叉树的带权路径长度WPL是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树,采用二叉链表存储,叶子结点的weight域为该结点的权值。请设计一个算法,求二叉树的带权路径长度。算法思想可以使用先序遍历或层次遍历解决问题。<1>算法思想一:基于先序递归遍历。用一个static变量记录WPL,把每个结点的深度作为递归函数的一个参数传递。若该结点是叶结点,则变量WPL加上该结点的深度与权值之和。若该结点是非叶结点,则左子树不为空时,对左子原创 2021-10-19 20:32:10 · 4180 阅读 · 0 评论 -
二叉树中的查找操作(按值查找、按位查找)
文章目录查找元素值为x的结点并删除以其为根的子树查找值为x的结点并打印其所有祖先查找元素值为x的结点并删除以其为根的子树题目描述: 已知二叉树以二叉链表存储,请编写一个算法:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。算法思想: 删除以元素值x为根的子树,只要能删除其左右子树,就可以释放值为x的结点,故采用后序的方式实现。 删除值为x的结点,意味着应将其父结点的左(右)子女指针置空,用层次遍历易于找到某结点的父结点。 要求删除树中每个元素值为x的结点的子树,故要遍历完二原创 2021-10-18 23:35:18 · 5747 阅读 · 0 评论 -
Huffman树和Huffman编码
文章目录Huffman树的定义Huffman树的定义原创 2021-10-10 12:18:18 · 3272 阅读 · 0 评论 -
平衡二叉树的定义及基本操作(查找、插入、删除)及代码实现
文章目录平衡二叉树的定义平衡二叉树的插入平衡二叉树的定义 为了避免树的高度增长过快,降低二叉排序树的性能,我们规定在插入和删除二叉树结点时,要保证在任意结点的左、右子树高度差的绝对值不超过1,将这样的树称为平衡二叉树(Balanced Binary Tree),简称平衡树(AVL)。 定义结点左子树与右子树的高度差为该结点的平衡因子,则平衡二叉树结点的平衡因子的值只可能是-1,0或1 。平衡二叉树可定义为: 或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和原创 2021-08-12 16:29:03 · 4627 阅读 · 0 评论 -
二叉排序树的定义及基本操作(构造、查找、插入、删除)递归及非递归算法
文章目录二叉排序树的定义二叉排序树的查找二叉排序树的插入二叉排序树的构造二叉排序树的删除二叉排序树的定义二叉排序树(Binary Sort Tree, BST),也称二叉查找树。二叉排序树或者是一棵空树,或者是一棵具有下列特性的非空二叉树:1) 若左子树非空,则左子树上所有结点关键字均小于根结点的关键字值;2) 若右子树非空,则右子树上所有结点关键字均大于根结点的关键字值;3) 左、右子树本身也分别是一棵二叉排序树。由定义可知,二叉排序树是一个递归的数据结构,可以方便的使用递归算法对二叉排序树原创 2021-07-31 15:10:41 · 44051 阅读 · 17 评论 -
树和森林的遍历
文章目录树和森林的遍历树的遍历树的先根遍历树的后根遍历层次遍历森林的遍历森林的先序遍历森林的中序遍历树和森林的遍历首先给出树和森林的遍历与二叉树遍历的对应关系:树森林二叉树先根遍历先序遍历先序遍历后根遍历中序遍历中序遍历树和森林的遍历均可采用对应二叉树的遍历算法来实现。本文只简单出给树和森林的遍历方法思想及实例。树的遍历 树的遍历操作就是按照某种方式访问树中的每个结点,且仅访问一次。树的遍历操作主要有先根遍历和后根遍历两种方式,此外还有层次遍历。树原创 2021-07-26 15:58:31 · 923 阅读 · 0 评论 -
树、森林与二叉树的相互转换
文章目录树转换为二叉树树转换为二叉树 二叉树和树都可以用二叉链表作为存储结构,因此二叉链表可以导出树与二叉树的一个对应关系,即给定一棵树,可以找到唯一的一棵二叉树与之对应。其中树的二叉链表存储详情可参照树的存储结构及详细完整代码。 树转换成二叉树的规则: <1>每个结点的左指针指向它的第一个孩子结点; <2>每个结点的右指针指向它在树中的相邻兄弟结点。 可表示为"左孩子右兄弟"。...原创 2021-07-26 14:30:38 · 25094 阅读 · 14 评论 -
树的存储结构及详细完整代码
文章目录树的存储结构<1>双亲表示法<2>孩子表示法<3>孩子兄弟表示法树的存储结构 树的存储方式有多种,既可以采用顺序存储结构,又可以采用链式存储结构,但无论何种存储方式,都要求能够唯一的反映树中各结点之间的逻辑关系。 常用的存储结构主要有: <1> 双亲表示法 <2> 孩子表示法 <3> 孩子兄弟表示法<1>双亲表示法 采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数原创 2021-07-23 19:26:22 · 6175 阅读 · 3 评论 -
关于树的判定(满二叉树、完全二叉树、平衡二叉树、相似二叉树、等价二叉树)
文章目录满二叉树完全二叉树相似二叉树等价二叉树满二叉树题目描述: 设二叉树采用二叉链表存储,设计一个算法,判断二叉树是否是满二叉树。算法思想: 满二叉树即深度为h,结点个数为2h-1的二叉树。实现代码:完全二叉树题目描述: 设二叉树采用二叉链表存储,设计一个算法,判断二叉树是否是完全二叉树。算法思想: 实现代码:相似二叉树题目描述: 设二叉树采用二叉链表存储,设计一个算法,判断两棵二叉树是否相似。 所谓二叉树T1和T2相似,指的是T1和T2都是空的二叉树或都原创 2021-07-21 16:59:18 · 713 阅读 · 0 评论 -
通过遍历序列构造二叉树(扩展二叉树的先序、先序和中序、后序和中序、层序和中序)附可执行完整代码
文章目录二叉树的构造扩展二叉树的先序遍历序列构造二叉树后序遍历序列和中序遍历序列构造二叉树层序遍历序列和中序遍历序列构造二叉树层序遍历序列和中序遍历序列构造二叉树二叉树的构造 可以构建一棵二叉树的几个方法:扩展二叉树的先序遍历序列前序遍历序列和中序遍历序列后序遍历序列和中序遍历序列层序遍历序列和中序遍历序列 注意,只有前序遍历序列和后序遍历序列是不能唯一的确定一棵二叉树的。扩展二叉树的先序遍历序列构造二叉树题目描述: 在二叉树的所有空指针位置加入虚拟结点,就构成扩展二叉树。二叉树原原创 2021-05-29 12:14:25 · 5423 阅读 · 0 评论 -
递归算法及非递归算法求二叉树的高度(二叉链表存储)
文章目录题目描述算法思想实现代码题目描述 假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度。算法思想 采用层次遍历的算法,设置变量level来记录当前结点所在的层数,设置变量last指向当前层的最右边的结点,每次层级遍历出队时与last指针比较,如果相等,则层数加1,并让last指向下一层的最右边的结点,直到遍历完成。那么最后的level的值即为二叉树的高度。实现代码完整代码:...原创 2021-05-25 21:33:52 · 4743 阅读 · 0 评论 -
详解二叉树的遍历问题(前序、后序、中序、层序遍历的递归算法及非递归算法及其详细图示)
文章目录二叉树的遍历先序遍历二叉树的遍历 所谓二叉树的遍历,是指按照某条搜索路径访问树中的每个结点,使得每个结点均被访问一次,且仅被访问一次。 由二叉树的递归定义可知,遍历一棵二叉树便要决定对根结点N、左子树L和右子树R的访问顺序。按照先遍历左子树再遍历右子树的原则,常见的遍历次序有先序(NLR)、中序(LNR)和后序(LRN)三种遍历算法,其中“序”指的是根结点在何时被访问。先序遍历 先序遍历(PreOrder)的操作过程如下:...原创 2021-05-23 15:28:08 · 1673 阅读 · 6 评论 -
二叉树的存储问题(顺序存储和链式存储)
文章目录二叉树的顺序存储二叉树的链式存储二叉树的顺序存储 二叉树的顺序存储结构是指用一组地址连续的存储单元依次从上而下、自左至右存储完全二叉树上的结点元素,即将完全二叉树上编号为 i 的结点元素存储在某个数组下标为 i 的分量中,然后通过一些方法确定结点在逻辑上的父子和兄弟关系。 根据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映结点之间的逻辑关系。 对于一般的二叉树,为了能让数组下标能反映二叉树中结点之间的逻辑关系,只能添加一些并不存在的空结点,让其每个结点与转载 2021-05-13 18:57:58 · 5034 阅读 · 0 评论 -
二叉树及特殊二叉树(满二叉树、完全二叉树、二叉排序树、平衡二叉树)的定义和性质(附详细推理过程)
文章目录二叉树的定义几个特殊的二叉树满二叉树二叉树的定义 二叉树是树的特殊形式,其特点是每个结点至多只有两棵子树,也就是说二叉树中不存在度大于2的结点,并且二叉树的子树有左右之分,其次序不能任意颠倒,即二叉树是有序树。 与树相似,二叉树也以递归的形式定义。二叉树是n(n≥0)个结点的有限集合。 1)或者为空二叉树,即n = 0, 2)或者由一个根结点和两个互不相交的被称为根的左子树和右子树组成。左子树和右子树又分别是以可二叉树。 二叉树是有序树,故二叉树的基本形态有以下五种:注意二叉树与度原创 2021-05-13 15:23:53 · 2425 阅读 · 0 评论 -
二叉树遍历应用之根据前序遍历建树
文章目录题目描述题目分析及实现思路题目实现完整代码题目描述题目分析及实现思路题目实现完整代码原创 2021-04-11 13:10:46 · 2516 阅读 · 0 评论 -
二叉树遍历应用之判断是否是同一二叉搜索树序列
文章目录题目描述二叉搜索树的建立判断两棵树是否相同题目完整实现代码题目描述判断两序列是否为同一二叉搜索树序列输入描述开始一个数n,(1<=n<=20) 表示有n个需要判断,n=0 的时候输入结束。接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。输出描述如果序列相同则输出YES,否则输出NO示例输入:原创 2021-04-10 15:56:59 · 684 阅读 · 0 评论 -
二叉树的遍历问题及二叉排序树
文章目录二叉排序树题目描述建立二叉排序树二叉树的三种遍历方式前序遍历中序遍历后序遍历题目实现完整代码二叉排序树题目描述输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。输入描述:输入第一行包括一个整数n(1<=n<=100)。接下来的一行包括n个整数。输出描述可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。每种遍历结果输出一行。每行最后一个数据之后有一个空格。输入中可能有重复元素,但是输出的二叉树原创 2021-04-09 22:38:13 · 649 阅读 · 0 评论 -
经典编程题——二叉树之首个公共父结点
二叉树的最小深度二叉树的定义什么是二叉树?二叉树和度为二的树有什么区别?度为二的树:每个结点至多有两个子树,且至少有一个结点有两个子树。二叉树:树中结点度数不大于2的有序树(区分左子树和右子树)。由此可知,第一,度为二的树不可为空,若为空树,则不用谈结点度数。而二叉树可以是空树。第二,度为二的树没有左右子树之分,二叉树有左子树、右子树的区别。如下图中,两个二叉树是不同的:题目要求求给定二叉树的最小深度。最小深度是指树的根结点到最近叶子结点的最短路径上结点的数量。示例:输原创 2021-04-09 17:42:56 · 190 阅读 · 2 评论