c语言中树(二叉树)的相关概念

1. 掌握树的基本概念

  • 树是一种非线性的数据结构,他通常是由n个(n>=0)有限结点组成的一个具有层次关系的集合。把他叫作树是因为
  • 它看起来像一颗倒挂的树,也就是说它是根朝上,叶朝下的。它具有以下的特点,每个结点有零个或者多个子结点;
  • 没有父结点的结点称作根结点;每一个非根结点有且只有一个父结点;除了根结点外,每个自结点又可以

2. 掌握树的相关概念

  • 结点的度:一个结点含有子树的个数称为该结点的度
  • 叶结点:度为0的结点称为叶结点
  • 双亲结点或父结点:若一个结点含有子结点,则称这个结点是该子结点的父结点
  • 孩子结点或子结点:一个结点含有的子树的根结点称为该结点的子结点
  • 兄弟结点:具有相同父结点的结点称为兄弟结点
  • 树的度:一棵树中,最大结点的度称为树的度
  • 树的高度或深度:树中结点的最大层次
  • 结点的层次:从根结点开始定义,根为第一层,根的子结点为第二层,以此类推

3. 掌握树的表示方式

  • 树结构的相对线性表比较复杂,因此想要表示比较复杂,实际引用中的表示方法有很多
    例如孩子兄弟表示法:
typedef int DataType;
		struct Node
		{
			struct Node* _firstChild1;   //第一个孩子结点
			struct Node* _pNextBrother;  //指向其下一个兄弟
			DataType _data;  //结点中的数据
		};

孩子表示法:

typedef int DataType;
		struct Node
		{
			DataType _data;
			struct Node* child1;
			struct Node* child2;
			struct Node* child3;
		};

双亲表示法(求双亲结点较为简单,求孩子结点比较复杂):

typedef int DataType;
	struct Node
	{
		DataType _data;
		struct Node* _parent;
	};

4. 熟悉二叉树的基本概念以及特性

一颗二叉树是结点的一个有限集合,该集合或者为空,或者是由根节点加上两棵分别称为左子树和
右子树的二叉树组成
二叉树的特点:
(1)每个节点最多有两棵子树,即二叉树不存在度大于2的节点
(2)二叉树的子树有左右之分,其次序不能颠倒

5.熟悉完全二叉树以及满二叉树的概念

  • 满二叉树:
    一个二叉树,如果其每一层的结点数都达到最大值,则这个二叉树为满二叉树。也就是说,如果
    一个二叉树的层数为k,且节点总数为(2^k)-1,则他就是满二叉树
  • 完全二叉树:
    完全二叉树是由满二叉树引申出来的,对于深度为K的,有n个节点的二叉树,当且仅当其每一个节点
    都与深度为k的满二叉树中编号1到n的节点一一对应,则称其为完全二叉树。

6. 熟悉二叉树的性质:

1.若规定根节点的层数为1,则一棵非空二叉树的第i层上最多有2^i-1(i>0)个节点

2.若规定只有根节点的二叉树的深度为1,则深度为k的二叉树的最大节点数为(2^k)-1(k>=0)

3.对任意一棵二叉树,如果其叶节点的个数为n0,度为2的非叶节点个数为n2, 则n0=n2+1

4.具有n个节点的完全二叉树的深度k为log2(n+1)向上取整(向大数取整)

5.对于具有n个节点的完全二叉树,如果按照从上至下,从左至右的顺序,对所有节点从0编号
序号i的特点:
(1)若i>0,双亲节点:(i-1)/2;
(2)若2i+1<n,则左孩子为2i+1;否则无左孩子
(3)若2i+2<n,则右孩子为2i+2;否则无右孩子

7. 熟悉二叉树的存储方式

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

链式存储:
通常的方法是链表中每个节点由三个域组成,数据域和左右指针域左右指针分别用来指向左孩子和右孩子所在链节点的存储地址。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树是一种特殊的形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。左子节点的值比父节点小,右子节点的值比父节点大,这种规则称为二叉查找(Binary Search Tree)。二叉树的结构可以用以下方式定义: ```c struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; ``` 其 `val` 表示节点的值,`left` 和 `right` 分别表示左子节点和右子节点。下面是一个简单的二叉查找的实现: ```c #include <stdio.h> #include <stdlib.h> struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; struct TreeNode* createNode(int val) { struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } struct TreeNode* insert(struct TreeNode* root, int val) { if (root == NULL) { return createNode(val); } if (val < root->val) { root->left = insert(root->left, val); } else { root->right = insert(root->right, val); } return root; } void inorderTraversal(struct TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } int main() { struct TreeNode* root = NULL; root = insert(root, 5); root = insert(root, 3); root = insert(root, 7); root = insert(root, 1); root = insert(root, 9); inorderTraversal(root); return 0; } ``` 在这个例子,我们定义了一个 `createNode` 函数来创建一个新的节点,一个 `insert` 函数来插入一个节点到二叉树,以及一个 `inorderTraversal` 函数来遍历二叉树并输出每个节点的值。我们使用 `insert` 函数来插入五个不同的节点,并使用 `inorderTraversal` 函数来遍历二叉树并输出节点的值,输出结果为: ``` 1 3 5 7 9 ``` 这里我们使用了序遍历(inorder traversal)来遍历二叉树,即先遍历左子,再输出当前节点,最后遍历右子。这种遍历方式可以将二叉查找的节点按照从小到大的顺序输出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值