目录
- 树的概念
- 树的特殊形式:二叉树
- 二叉树的性质及分类
- 二叉树的不同应用
树的概念
树,是在数据结构中的一中非线性的数据结构,顾名思义,它的结构就像树一样:包括树的根,散开的枝叶。树产生的意义是弥补其他数据结构:数组,队列,栈等表达层面的不足和提高动态查找效率,在定位文件,搜索引擎中有重要意义。先回答上面的层次问题。其他数据结构像数组,队列它们只能表示一对一的对应关系,而现实中大量数据是一对多的关系:如族谱,文件与子文件的关系,树就应运而生了。树一般通过递归来实现历遍,查找等功能,速度尤其的快,并且动态性极好——不需要预先分配连续空间,插入删除只需调整指针。所以学好树对于我们新手来说对于数据结构的认知会提升很多。
下面,我们就开始对树的具体介绍了。
定义:树是由 n(n ≥ 0) 个节点组成的非线性、层次型数据结构。当 n=0 时,称为空树。树有且仅有一个根节点(相当于树的根),其余节点分为 m 个互不相交的子树(相当于树的枝叶)。

核心术语
节点(Node):树的基本单位,存数据及指向子节点的指针。
根节点(Root):树的顶端,唯一无父节点的节点(如 A)。
父节点 / 子节点:直接相连的上下层节点(A 是 B、C、D 的父节点)。
兄弟节点:同一父节点的子节点(B、C、D 互为兄弟)。
叶节点(Leaf):度为 0(无子节点)的节点(G、H、I、F、J),其两个指针均指向 None。
度(Degree):节点拥有的子节点个数。
A 的度 = 3,B 的度 = 2,G 的度 = 0。
树的度:所有节点度的最大值(此树度为 3)。

深度(Depth):从根到该节点的层数(根为第 1 层)。
高度(Height):从该节点到最远叶子的最长路径层数。

二叉树
二叉树(binary tree)是n(n≥0)个节点的有限集合:或者是空二叉树,即n = 0;或者由一个根节点 和两个互不相交的被成为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。

注意:二叉树每个节点最多只能有两个子节点,并且左右子树的顺序不能颠倒,是有顺序的。
特殊二叉树
-
满二叉树(又称完美二叉树)
除最后一层外,每层节点都有两个孩子;所有叶子在同一层。

其特点为第n层的总点数有2^n-1个节点。 -
完全二叉树
只有最底层的节点未被填满,且最底层节点尽量靠左排列。(满二叉树也是完全二叉树)

二叉树的性质
(1)每一层最大节点值:2^n-1;
(2)深度为k的二叉树最多有2^n-1个节点
二叉树的应用
1.创建一个二叉树(创建一棵有 3 个结点的二叉树)
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode{
int data;
struct TreeNode *firstchild;
struct TreeNode *nextb;
}TreeNode,*Tree;
Tree creatNode(int data){
Tree newNode=(Tree)malloc(sizeof(TreeNode));
if(newNode!=NULL){
newNode->data=data;
newNode->firstchild=NULL;
newNode->nextb=NULL;
}
return newNode;
}
void addChild(Tree parent,Tree child){
if(parent==NULL||child==NULL)return;
if(parent->firstchild==NULL){
parent->firstchild=child;
}
else{
Tree temp=parent->firstchild;
while(temp->nextb!=NULL){
temp=temp->nextb;
}
temp->nextb=child;
}
}
void freeTree(Tree root) {
if (!root) return;
freeTree(root->firstchild);
freeTree(root->nextb);
free(root);
}
int main(){
int nroot,leftchild,rightchild;
scanf("%d%d%d",&nroot,&leftchild,&rightchild);
Tree left=creatNode(leftchild);
Tree right=creatNode(rightchild);
Tree root=creatNode(nroot);
addChild(root,left);
addChild(root,right);
printf("root data = %d\n",root->data);
printf("left child data = %d\n",left->data);
printf("right child data = %d\n",right->data);
freeTree(root);
return 0;
}
&spm=1001.2101.3001.5002&articleId=160051664&d=1&t=3&u=3241fc62fc3444c5b56020e41feac0e5)
6359

被折叠的 条评论
为什么被折叠?



