新手入门:【数据结构】树与二叉树(初步了解和构造)

目录

  1. 树的概念
  2. 树的特殊形式:二叉树
  3. 二叉树的性质及分类
  4. 二叉树的不同应用
    树的概念
    树,是在数据结构中的一中非线性的数据结构,顾名思义,它的结构就像树一样:包括树的根,散开的枝叶。树产生的意义是弥补其他数据结构:数组,队列,栈等表达层面的不足和提高动态查找效率,在定位文件,搜索引擎中有重要意义。先回答上面的层次问题。其他数据结构像数组,队列它们只能表示一对一的对应关系,而现实中大量数据是一对多的关系:如族谱,文件与子文件的关系,树就应运而生了。树一般通过递归来实现历遍,查找等功能,速度尤其的快,并且动态性极好——不需要预先分配连续空间,插入删除只需调整指针。所以学好树对于我们新手来说对于数据结构的认知会提升很多。
    下面,我们就开始对树的具体介绍了。
    定义:树是由 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;或者由一个根节点 和两个互不相交的被成为根的左子树和右子树组成。左子树和右子树又分别是一颗二叉树。
在这里插入图片描述
注意:二叉树每个节点最多只能有两个子节点,并且左右子树的顺序不能颠倒,是有顺序的。
特殊二叉树

  1. 满二叉树(又称完美二叉树)
    除最后一层外,每层节点都有两个孩子;所有叶子在同一层。
    在这里插入图片描述
    其特点为第n层的总点数有2^n-1个节点。

  2. 完全二叉树
    只有最底层的节点未被填满,且最底层节点尽量靠左排列。(满二叉树也是完全二叉树)
    在这里插入图片描述
    二叉树的性质
    (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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值