在回忆学生时代学习树这种数据结构时,仅有的回忆就是前中后遍历,其余毫无印记
在工作当中,好像就没有怎么用到,更不用说编码去实现,调试
其实不然,AVL树,红黑树等等都是有实际的应用,所以掌握好基本的知识点还是非常必要的
以最简单常用的基础开始
树的表现:
链表 的形式最为常见,因为树是有分支的,是 非线性的
正如自然界的树,只不过树根在上,分支在下,最末为叶子
我们研究的都是基于 二叉树
二叉树:是 n(n >= 0)个结点的有限集合,该集合或为空集(空二叉树)。或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成
树的操作:
创建:通过不断的创建树的节点,组成了一颗自定义树的形态
查找:遍历树的所有节点
前序遍历,中序遍历,后序遍历,层序遍历
树的特性:
正如图示,树是一种 非线性的存储关系
父节点下面存在左右子节点,每个子节点又可能是以该节点为根节点的一颗子树
我们通过链表指针的关系构建的树,自然能够通过指针找寻到想要的数据
树的创建:
1. 树的结构体
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
2. 创建
struct TreeNode* createNode(int val, struct TreeNode* left, struct TreeNode* right)
{
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->val = val;
node->left = left;
node->right = right;
return node;
}
3. 自定义树,需要从叶子节点开始写,这样父节点才能知道
struct TreeNode* node7 = createNode(7, NULL, NULL);
struct TreeNode* node6 = createNode(6, NULL, node7);
struct TreeNode* node5 = createNode(5, NULL, NULL);
struct TreeNode* node4 = createNode(4, NULL, NULL);
struct TreeNode* node3 = createNode(3, node5, node6);
struct TreeNode* node2 = createNode(2, node4, NULL);
struct TreeNode* node1 = createNode(1, node2, node3);
树的查找: