二手网站设计与建设最新外贸seo
二手网站设计与建设,最新外贸seo,免费服务器建站,公司网站建设合同书文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1#xff1a;二叉树中层数为i的结点至多有 2 i 2^i 2i个#xff0c;其中 i ≥ 0 i \geq 0 i≥0。引理5.2#xff1a;高度为k的二叉… 文章目录 5.1 树的基本概念5.1.1 树的定义5.1.2 森林的定义5.1.3 树的术语5.1.4 树的表示 5.2 二叉树5.2.1 二叉树1. 定义2. 特点3. 性质引理5.1二叉树中层数为i的结点至多有 2 i 2^i 2i个其中 i ≥ 0 i \geq 0 i≥0。引理5.2高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点其中 k ≥ 0 k \geq 0 k≥0。引理5.3设T是由n个结点构成的二叉树其中叶结点个数为 n 0 n_0 n0度数为2的结点个数为 n 2 n_2 n2则有 n 0 n 2 1 n_0 n_2 1 n0n21。 4. 满二叉树5. 完全二叉树 5.2.2 二叉树顺序存储典例例题C语言实现答案 5.1 树的基本概念
5.1.1 树的定义
一棵树是结点的有限集合T 若T非空则 有一个特别标出的结点称作该树的根记为root(T)其余结点分成若干个不相交的非空集合T1, T2, …, Tm (m0)其中T1, T2, …, Tm又都是树称作root(T)的子树。 T 空时为空树记作root(T)NULL。
5.1.2 森林的定义 一个森林是0棵或多棵不相交非空树的集合通常是一个有序的集合。换句话说森林由多个树组成这些树之间没有交集且可以按照一定的次序排列。在森林中每棵树都是独立的具有根节点和子树树与树之间没有直接的连接关系。 森林是树的扩展概念它是由多个树组成的集合。在计算机科学中森林也被广泛应用于数据结构和算法设计中特别是在图论和网络分析等领域。
5.1.3 树的术语
父亲parent、儿子child、兄弟sibling、后裔descendant、祖先ancestor度degree、叶子节点leaf node、分支节点internal node结点的层数路径、路径长度、结点的深度、树的深度
参照前文【数据结构】树与二叉树一树森林的基本概念父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度
5.1.4 树的表示
【数据结构】树与二叉树二树的表示C语言树形表示法、嵌套集合表示法、嵌套括号表示法 、凹入表示法
5.2 二叉树
5.2.1 二叉树
1. 定义 二叉树是一种常见的树状数据结构它由结点的有限集合组成。一个二叉树要么是空集被称为空二叉树要么由一个根结点和两棵不相交的子树组成分别称为左子树和右子树。每个结点最多有两个子结点分别称为左子结点和右子结点。
2. 特点 二叉树的特点是每个结点最多有两个子结点并且子结点的位置是有序的即左子结点在前右子结点在后。这种有序性使得二叉树在搜索、排序等算法中有广泛的应用。 在二叉树中根结点是整个树的起始点通过根结点可以访问到整个树的其他结点。每个结点都可以看作是一个独立的二叉树它的左子树和右子树也是二叉树。 二叉树可以是空树也可以是只有根结点的树或者是由多个结点组成的树。每个结点可以包含一个数据元素以及指向左子结点和右子结点的指针。 二叉树的形状可以各不相同它可以是平衡的或者不平衡的具体取决于结点的分布情况。在二叉树中每个结点的左子树和右子树都是二叉树因此可以通过递归的方式来处理二叉树的操作。
3. 性质
引理5.1二叉树中层数为i的结点至多有 2 i 2^i 2i个其中 i ≥ 0 i \geq 0 i≥0。
引理5.2高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点其中 k ≥ 0 k \geq 0 k≥0。
引理5.3设T是由n个结点构成的二叉树其中叶结点个数为 n 0 n_0 n0度数为2的结点个数为 n 2 n_2 n2则有 n 0 n 2 1 n_0 n_2 1 n0n21。
详细证明过程见前文【数据结构】树与二叉树三二叉树的定义、特点、性质及相关证明
4. 满二叉树 定义5.3一棵非空高度为 k ( k ≥ 0 ) k( k≥0) k(k≥0)的满二叉树(perfect binary tree)是有 2 k 1 − 1 2^{k1}-1 2k1−1个结点的二叉树。
5. 完全二叉树 定义5.4一棵包含 n n n个节点、高度为 k k k的二叉树 T T T当按层次顺序编号 T T T的所有节点对应于一棵高度为 k k k的满二叉树中编号由1至 n n n的那些节点时 T T T被称为完全二叉树complete binary tree。
满二叉树、完全二叉树性质及证明【数据结构】树与二叉树四满二叉树、完全二叉树及其性质
5.2.2 二叉树顺序存储 二叉树的顺序存储是指将二叉树中所有结点按层次顺序存放在一块地址连续的存储空间中 对于完全二叉树结点的层次顺序反映了其结构可按层次顺序给出一棵完全二叉树之结点的编号事实上这就是完全二叉树的顺序存储方法结点编号恰好反映了结点间的逻辑关系。 只要对完全二叉树之结点按照层次顺序进行编号就可利用一维数组 A A A来存储一棵含有 n n n个结点的完全二叉树其中A[1]存储二叉树的根结点A[i]存储二叉树中编号为i的结点并且结点A[i]的左儿子若存在存放在A[2i]处而A[i]的右儿子若存在存放在A[2i1]处。注意这里我们约定数组索引从1开始而不是从0开始在使用数组存储完全二叉树时需要留出A[0]位置不使用。
典例 首先我们按照完全二叉树的结点顺序进行编号从上到下、从左到右依次编号。根据给出的完全二叉树我们可以得到以下结点编号 1/ \2 3/ \4 5接下来我们可以利用一维数组来存储这棵完全二叉树。创建一个大小为6的数组A其中A[1]表示根结点 A A AA[2]表示结点 B B BA[3]表示结点 E E EA[4]表示结点 C C CA[5]表示结点 D D D。
索引 1 2 3 4 5
数组 [ A, B, E, C, D ]根据完全二叉树的性质结点 A A A的左儿子应该存放在A[2]的位置右儿子应该存放在A[3]的位置。结点 B B B的左儿子应该存放在A[4]的位置右儿子应该存放在A[5]的位置。
例题 画出下面这棵完全二叉树的顺序存储结构 答案见文末 答案见文末 答案见文末 完全二叉树的顺序存储方式是一种简单且节省空间的存储方式。它只需要使用一个一维数组来存储完全二叉树的结点信息域的值而不需要额外的空间来存储左儿子和右儿子的地址。 通过计算结点的编号和数组索引之间的关系我们可以方便地找到结点的左儿子、右儿子和父亲结点。例如对于结点i它的左儿子的编号是2i右儿子的编号是2i1父亲结点的编号是⌊i/2⌋。这种计算关系使得寻找子孙结点和祖先结点变得非常方便和高效。 顺序存储方式的优点是节省了存储空间同时访问结点也非常快速因为可以通过数组索引直接访问结点而不需要进行指针的跳转。然而顺序存储方式也有一些限制。由于使用数组存储需要提前确定完全二叉树的最大结点个数因此对于结点数不确定或者动态变化的情况下顺序存储方式可能不适用。
C语言实现 注意这里我们约定数组索引从0开始节点位置计算公式与前文略有不同。
#include stdio.h
#include stdlib.h#define MAX_SIZE 100 // 定义数组的最大大小// 二叉树的顺序存储结构
typedef struct {char data[MAX_SIZE]; // 数组用于存储结点的数据int size; // 二叉树的大小结点个数
} BinaryTree;// 初始化二叉树
void initBinaryTree(BinaryTree* tree) {tree-size 0;
}// 向二叉树中插入结点
void insertNode(BinaryTree* tree, int value, int index) {if (tree-size MAX_SIZE) {printf(Binary tree is full. Cannot insert more nodes.\n);return;}if (index 0 || index tree-size) {printf(Invalid index.\n);return;}// 将插入位置后的结点后移for (int i tree-size - 1; i index; i--) {tree-data[i 1] tree-data[i];}// 插入新结点tree-data[index] value;tree-size;
}// 获取结点的父节点编号
int getParentIndex(int index) {return (index - 1) / 2;
}// 获取结点的左子节点编号
int getLeftChildIndex(int index) {return 2 * index 1;
}// 获取结点的右子节点编号
int getRightChildIndex(int index) {return 2 * index 2;
}// 根据索引获取结点的值
char getNodeValue(BinaryTree* tree, int index) {if (index tree-size || index 0) {printf(Invalid index.\n);return -1;}return tree-data[index];
}int main() {BinaryTree tree;initBinaryTree(tree);// 向二叉树中插入结点insertNode(tree, A, 0); insertNode(tree, B, 1); insertNode(tree, E, 2); insertNode(tree, C, 3); insertNode(tree, D, 4); // 获取结点的值和子节点的值char rootValue getNodeValue(tree, 0);char leftChildValue getNodeValue(tree, getLeftChildIndex(0));char rightChildValue getNodeValue(tree, getRightChildIndex(0));printf(Root value: %c\n, rootValue);printf(Left child of Root: %c\n, leftChildValue);printf(Right child of Root: %c\n, rightChildValue);printf(the Parent of B: %c\n, getNodeValue(tree, getParentIndex(1)));printf(the Parent of C: %c\n, getNodeValue(tree, getParentIndex(3)));printf(the Parent of D: %c\n, getNodeValue(tree, getParentIndex(4)));printf(the Parent of E: %c\n, getNodeValue(tree, getParentIndex(2)));return 0;
} 答案
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88206.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!