首页天道酬勤二叉树基本单元,二叉树层次遍历c语言

二叉树基本单元,二叉树层次遍历c语言

admin 07-13 09:01 123次浏览

一、 树的概念以及相关概念

1、非线性的数据结构,是由n(n=0)个有限节点构成的具有层次关系的集合。 将其称为树具有以下特征:

每个节点都有零个或多个子节点。 没有父节点的节点称为根节点; 每个非根节点只有一个父节点。 除了根节点以外,每个子节点可以被分成多个它看起来像一颗倒挂的树,也就是说它是根朝上,而叶朝下的

2、树的术语节点度:一个节点中包含的子树的个数称为该节点的度; 叶节点或终端节点:度为0的节点称为叶节点; 非终止节点或分支节点:度不是0的节点; 父节点或父节点:如果某个节点有子节点,则该节点称为其子节点的父节点。 子节点或子节点:将个节点中包含的子树的根节点称为该节点的子节点; 兄弟节点:彼此将具有相同父节点的节点称为兄弟节点; 树度:棵树中,最大的节点度叫做树度; 节点分层:从根定义,高度或深度:树中节点的最大等级,例如根是第一层,根的子节点是第二层; 表兄弟节点:父母在同一层节点上彼此是表兄弟; 节点祖先:从根开始经由该节点到达分支上的所有节点; 子孙:把某个节点作为根的子树的某个节点称为该节点的子孙。 森林:将m(m=0)棵互不相交的树的集合称为森林; 3、树的种类

无序树(树中任意节点的子节点之间没有顺序关系。 这种树叫无序树,也叫自由树。 顺序树(树中任意节点的子节点之间存在顺序关系,这种树称为顺序树; 二叉树:将每个节点最多包含两个子树的树称为二叉树; 完全二叉树:对于一棵二叉树,将其深度设为d(d1 )。 除d层外,其他层节点数均达到最大值。 也就是说,子节点的数量为2。 D层的所有节点从左到右连续紧密排列。 这样的二叉树叫做完全二叉树。 这里,满二叉树的定义是所有叶节点都在最底层的完全二叉树。 二叉树(AVL树) (任意节点的2棵部分树的高度差在1以下的二叉树; 二叉树(Binary Search Tree ),又称二叉树检索树、有序二叉树; nrdyj树(用于信息编码)将加权路径最短的二叉树称为霍夫曼树或最佳二叉树; B树)一种读写操作优化的自平衡双叉搜索树,可以保持数据有序,具有多馀的两个子树。不相交的子树

线路规有二、树的存储与表示顺序存储两种存储方式。 二叉树的记忆也是线性表结构,所以也有逐次记忆和连锁记忆两种方式。

链式存储顺序存储是一种爱与恨的游戏。 因为爱容易理解,容易寻找; 因为这个游戏很蠢。 每次只需要从内存中请求连续的空间,无论实际的APP是否足够,而且这个商品在插入和删除元素时都需要O(n**2)的时间复杂度。 这有点让人无语。 将数据结构存储在固定数组中,在遍历速度方面具有一定的优势,但由于占用空间比较大,是非主流二叉树,二叉树通常采用链式存储。顺序存储:链式存储的结构分为二叉树结构和三叉链表结构两种。 我们重点介绍二叉链表、二叉链表结构。 一个二叉链表节点由数据域、左子指针和右子指针三部分组成。

链式存储分配给顺序存储器的内存空间大小是固定的,不希望随着二叉树节点数的增加而动态扩展。 内存空间分配太大的话,会浪费内存空间。 如果分配太小,则会出现数组溢出问题。 另外,追加删除节点时的时间复杂度为o(n^2)。 顺序存储的优点是容易找到节点。 链式存储可以动态分配内存空间,比顺序存储更灵活、更方便。 最大节点数仅与系统存储区域有关。 另外,插入/删除节点时的时间复杂度只有o(n )。 因此,在操作二叉树时往往采用链式内存结构。顺序存储与链式存储比较

对于创建这些内容的解析器,如. xml和html,不可避免地要使用树。 由于路由协议是基于树的算法mysql数据库索引文件系统的目录结构,所以许多经典的AI算法实际上是树搜索。 另外,机器学习中的诊断树也适用于树结构三、 常见的一些树的应用场景

树的结构相对于线性表很复杂,表达很麻烦。 实际上,树有很多表达方式,比如孩子的表达、父母的表达、xhdpd的表达等。

孩子的表现: struct Node {

TDataType _data;

struct Node* child1;

struct Node* child2;

struct Node* child3;

}

父母的书写: struct Node {

TdataType _data;

struct Node* _parent;

}

xhdpd表示法: struct Node {

struct Node* _child1;

struct Node* _pNextBrother;

TDataType _data;

}

孩子双亲表示法:

struct Node {
struct Node* _child1;
struct Node* _parent;
TDataType _data;
}

五、熟悉二叉树的基本概念以及特性

一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵别称为左子树和右子树的二叉树组成。

六、二叉树的特点:

每个节点最多有两棵子树,即二叉树不存在度大于2的结点。
二叉树的子树有左右之分,其子树的次序不能颠倒。

七、 熟悉完全二叉树以及满二叉树的概念

1、满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。每一次节点个数:2^(i-1);
2、完全二叉树
如果一颗二叉树的n个节点与满二叉树前n个节点的组织形式完全相同成为完全二叉树。
完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。要注意的是满二叉树是一种特殊的完全二叉树。

满二叉树是一颗特殊的完全二叉树,但完全二叉树比一定是满二叉树。

八、熟悉二叉树的性质:

(1)若规定根节点的层数为1,则一颗非空二叉树的第i层上最多有2i-1 (i>0)个节点
(2)若规定只有根节点的二叉树的深度为1,则深度为k的二叉树的最大节点个数是2k -1(k>0)
(3)对任意一颗二叉树,如果其叶节点个数为n0,度为2的非叶节点个数为n2,则有 n0 = n2 +1
(4)具有n个节点的完全二叉树的深度k为log2 (n+1)向上取整
(5)对于具有n个节点的完全二叉树,如果按照从上到下从左至右的顺序对所有节点从0开始编号,则对于编号为i的节点有:

若 i > 0,则i的双亲序号:(i - 1)/2
若 2i+1<n,左孩子序号:2i+1,否则无左孩子
若2i+2<n,右孩子序号:2i+2,否则无右孩子
(6)二叉树中总共有N-1条边,也可以表示为n1+n2 * 2条边,二叉树中有N个节点N=n0+n1+n2;N=n1+2*n2+1;
(7)完全二叉树中最多只能有1个度为1的节点
不可能存在某个节点只有右孩子没有左孩子的情况
完全二叉树节点个数为奇数:没有度为1的孩子
完全二叉树节点个数为偶数:有1个度为1的孩子

九、二叉树的存储方式
二叉树一般可以使用两种结构存储,一种顺序结构,一种链式结构。

顺序存储:
顺序结构存储就是使用数组来存储,一般使用数组只适合表示完全二叉树,因为不是完全二叉树会有空间的浪费。而现实中使用中只有堆才会使用数组来存储。二叉树顺序存储在物理上是一个数组,在逻辑上是一颗二叉树。

链式存储: 二叉树的链式存储结构是指,用链表来表示一棵二叉树,即用链来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址。链式结构又分为二叉链和三叉链。

// 二叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pLeft; //指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data;// 当前节点值域
}
/ / 三叉链
struct BinaryTreeNode
{
struct BinTreeNode* _pParent; // 指向当前节点的双亲
struct BinTreeNode* _pLeft; // 指向当前节点左孩子
struct BinTreeNode* _pRight; // 指向当前节点右孩子
BTDataType _data; // 当前节点值域
}

IDEA中切换不同版本的JDK的详细教程(超管用)
先序中序后序遍历二叉树,二叉树项目实战c代码 抬手亮屏怎么打开,苹果双击亮屏怎么设置
相关内容