大家好,这里是小编的博客频道
小编的博客:就爱学编程
很高兴在CSDN这个大家庭与大家相识,盼望能在这里与大家共同进步,共同收获更好的本身!!!
那接下来就让我们开始遨游在知识的海洋!
一、树的根本概念
界说:树是一种非线性数据结构,它由 n(n≥0)个有限节点组成一个具有层次关系的集合。它有一个特殊的节点,称为根节点,别的节点分成 m(m≥0)个互不相交的子集,每个子集又是一棵树,称为原树的子树。
根本术语:
- 节点的度:一个节点含有的子树的个数称为该节点的度。
- 叶子节点:度为 0 的节点称为叶节点或终端节点。
- 非叶子节点:度不为 0 的节点称为非叶节点或非终端节点。除根节点之外,非叶子节点也称为内部节点。
- 节点的层次:从根开始界说起,根为第一层,根的子节点为第二层,以此类推。
- 树的高度或深度:树中节点的最大层次。
- 父节点和子节点:若节点 A 有直达节点 B 的路径,且 A 在这条路径上距离 B 最近,则称 A 为 B 的父节点,B 是 A 的子节点。
- 兄弟节点:有共同父节点的节点互为兄弟节点。
表示方法:可以用孩子链表表示法、双亲孩子表示法和孩子-兄弟表示法等来表示一棵树。
二、二叉树的根本概念
界说:二叉树是树形结构的一种特殊形式,它的特点是每个节点最多有两个子节点,通常被称为左子节点和右子节点。
性子:
在二叉树的第 i 层上至多有 2^(i-1) 个节点(i≥1)。
深度为 k 的二叉树至多有 2^k - 1 个节点(k≥1)。
对任何一棵二叉树 T,如果其终端节点数为 n0,度为 2 的节点数为 n2,则 n0 = n2 + 1。
分类:
满二叉树:一棵深度为 k 且有 2^k - 1 个节点的二叉树称为满二叉树。
完全二叉树:深度为 k 的,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中编号从 1 至 n 的节点逐一对应时称之为完全二叉树。
遍历方法:
- 前序遍历:访问次序是根节点→左子树→右子树。
- 中序遍历:访问次序是左子树→根节点→右子树。
- 后序遍历:访问次序是左子树→右子树→根节点。
- 层序遍历:按树的结构从上到下、从左到右依次访问各个节点。
三、在 C 语言中实现二叉树
在 C 语言中,可以使用结构体和指针来实现二叉树。以下为例:
- #include <stdio.h>
- #include <stdlib.h>
- // 定义二叉树节点结构体
- typedef struct TreeNode {
- int val;
- struct TreeNode *left;
- struct TreeNode *right;
- } TreeNode;
- // 创建新节点
- TreeNode* createNode(int val) {
- TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
- newNode->val = val;
- newNode->left = NULL;
- newNode->right = NULL;
- return newNode;
- }
- // 前序遍历
- void preOrderTraversal(TreeNode* root) {
- if (root == NULL) return;
- printf("%d ", root->val);
- preOrderTraversal(root->left);
- preOrderTraversal(root->right);
- }
- // 中序遍历
- void inOrderTraversal(TreeNode* root) {
- if (root == NULL) return;
- inOrderTraversal(root->left);
- printf("%d ", root->val);
- inOrderTraversal(root->right);
- }
- // 后序遍历
- void postOrderTraversal(TreeNode* root) {
- if (root == NULL) return;
- postOrderTraversal(root->left);
- postOrderTraversal(root->right);
- printf("%d ", root->val);
- }
- int main() {
- // 创建二叉树
- TreeNode* root = createNode(1);
- root->left = createNode(2);
- root->right = createNode(3);
- root->left->left = createNode(4);
- root->left->right = createNode(5);
- // 遍历二叉树
- printf("Pre-order traversal: ");
- preOrderTraversal(root);
- printf("
- ");
- printf("In-order traversal: ");
- inOrderTraversal(root);
- printf("
- ");
- printf("Post-order traversal: ");
- postOrderTraversal(root);
- printf("
- ");
- // 注意:这里只是示例代码,没有实现释放内存的操作,实际使用中需要添加释放内存的代码以避免内存泄漏。
- return 0;
- }
复制代码
- 这个例子中,我们界说了二叉树节点的结构体 TreeNode ,并实现了创建新节点和前序、中序、后序遍历的函数。然后在 main 函数中创建了一个简单的二叉树,并对它进行了遍历。
快乐的时光总是短暂,咱们下篇博文再见啦!!!不要忘了,给小编点点赞和收藏支持一下,在此非常感谢!!!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |