赞
踩
树是一种非线性的数据结构,由节点和边组成。树的定义如下:
树的节点之间的关系可以用父子关系来描述,每个节点可以有零个或多个子节点,但只能有一个父节点。树的结构使得数据可以以层次结构的方式组织和存储,非常适合用于表示具有层次关系的数据。像我们的文件结构都是树形结构。
树的一些常见术语包括:根节点、叶子节点、父节点、子节点、深度、高度等。
本篇文章主要针对二叉树,当然二叉树是树形的一种,树也不只是二叉树,也是有三叉树,四叉树等结构,但本文不以深究。(二叉树才是程序猿的神)
(1)满二叉树:每个节点要么没有子节点,要么有两个子节点。换句话说,除了叶子节点外,每个节点都有两个子节点。如下图所示:
(2)完全二叉树:在完全二叉树中,除了最后一层外,其它层的节点都是满的,并且最后一层的节点都靠左排列。换句话说在同一深度下,同一父节点的左子树一定要比右子树先出现。
如上图(b)中,同一父节点D下,没有左子树而有右子树 G,故此树是非完全二叉树。
(3)二叉搜索树:也称为有序二叉树,是一种特殊的二叉树,对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,右子树上的所有节点的值都大于该节点的值。(左小根,右大根)
注意: 将二叉搜索树进行 先序遍历时,得到的是一个递增的序列。
在完全二叉树中,常见的计算包括:
节点个数的计算:完全二叉树的节点个数可以通过其高度来计算。如果完全二叉树的高度为h,则节点个数为 2^h - 1。
高度的计算:完全二叉树的高度可以通过其节点个数来计算。如果完全二叉树的节点个数为n,则高度为log2(n+1)。
父节点和子节点的计算:对于完全二叉树中的任意一个节点i,其父节点为 (i-1)/2,左子节点为 2i+1,右子节点为 2i+2。
层次遍历:层次遍历是一种常见的完全二叉树的遍历方式,可以通过队列来实现。按照从上到下、从左到右的顺序遍历完全二叉树的所有节点。
计算节点数量:由于满二叉树的特点是每层节点数都是满的,因此可以通过树的深度来计算满二叉树的节点数量。节点数量为 2^h - 1,其中 h 为树的高度。
计算树的高度:由于满二叉树的节点数和高度之间有确定的关系,可以通过节点数量来计算树的高度。树的高度为 log2(n+1),其中 n 为节点数量。
(1) 双指针表示法: (父节点和子节点之间的关系用 left 和 right 指针表示)
此种表示方法:
优点:
缺点:不具备二叉搜索树的性质
- typedef struct TreeNode
- {
- int val;
- struct TreeNode* left;
- struct TreeNode* right;
- }Tree;
(2)左孩子右兄弟表示法:
- typedef struct TreeNode
- {
- int val;
- struct TreeNode* leftChild;
- struct TreeNode* rightBrother;
- }Tree;
优点: 这种表示法比较灵活,可以表示各种形式的树,包括二叉树、多叉树等。
缺点: 操作复杂:对于多叉树的插入、删除、搜索等操作可能比较复杂,需要额外的逻辑来处理右兄弟指针的连接和断开。
总的来说,树这个东西,理论很简单,但针对树一系列运算会很难。
比如: 求深度/高度 ,节点个数, 判断二叉树是否为平衡二叉树或者是否是完全二叉树等。
一起加油吧,少年,你我共勉!!!
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。