基础结构之树结构详解

一)什么是树(tree)

 

 树是n(n≥0)个节点的有限集。当n=0时,称为空树。在任意一个非空树中,有如下特点:

  1. 有且仅有一个特定的称为根的节点。

  2. 当n>1时,其余节点可分为m(m>0)个互不相交的有限集,每一个集合本身又是一个树,并称为根的子树。

 术语:根节点、子树、叶子节点、父节点、孩子节点、兄弟节点、树的高度

二)二叉树

二叉树(binary tree)是树的一种特殊形式。这种树的每个节点最多有2个孩子节点。注意,这里是最多有2个,也可能只有1个,或者没有孩子节点

 

二叉树的存储

1.链式存储

  • 存储数据的data变量

  • 指向左孩子的left指针

  • 指向右孩子的right指针

2.数组存储

 

使用数组存储时,会按照层级顺序把二叉树的节点放到数组中对应的位置上。如果某一个节点的左孩子或右孩子空缺,则数组的相应位置也空出来,这样可以更方便地在数组中定位二叉树的孩子节点和父节点:

父节点下标 parent,那么左孩子下标为 leftChild = 2×parent + 1;右孩子下标为 rightChild = 2×parent + 2

思考:什么二叉树适合用数组存储?

二叉树的遍历

线性结构(数组、链表)的遍历很简单,那么非线性结构树是如何遍历的呢?

主要分为:深度优先遍历(先序遍历、中序遍历、后序遍历)广度优先遍历(层序遍历)

深度优先遍历

先序(根)遍历

先序遍历输出顺序是根节点、左子树、右子树

<

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C是一门非常基础的编程语言,它没有像其他语言那样提供内置的数据结构。但是,C提供了足够的工具和语法来实现不同类型的数据结构。 以下是C中常见的一些数据结构及其实现方式: 1. 数组:C中的数组是存储相同类型数据的一种数据结构。数组的大小在声明时指定,且大小不可改变。 ```c int arr[10]; // 声明一个包含10个整数的数组 ``` 2. 结构体:结构体是一种自定义数据类型,它可以包含不同类型的数据,也可以嵌套其他结构体。 ```c struct student { char name[20]; int age; float score; }; // 定义一个包含姓名、年龄和分数的结构体 struct student s1; // 声明一个结构体变量 ``` 3. 链表:链表是由节点组成的一种数据结构,每个节点包含数据和指向下一个节点的指针。 ```c struct node { int data; struct node *next; }; // 定义一个包含数据和指向下一个节点的指针的结构体 struct node *head = NULL; // 声明一个链表头指针 ``` 4. 栈:栈是一种后进先出(LIFO)的数据结构,可以用数组或者链表来实现。 ```c #define MAX_SIZE 10 int stack[MAX_SIZE]; // 用数组实现栈 int top = -1; // 栈顶指针 void push(int value) { if (top < MAX_SIZE - 1) { stack[++top] = value; // 将数据压入栈中 } } int pop() { if (top >= 0) { return stack[top--]; // 弹出栈顶元素 } } ``` 5. 队列:队列是一种先进先出(FIFO)的数据结构,可以用数组或者链表来实现。 ```c #define MAX_SIZE 10 int queue[MAX_SIZE]; // 用数组实现队列 int front = 0, rear = -1; // 队列头和队列尾 void enqueue(int value) { if (rear < MAX_SIZE - 1) { queue[++rear] = value; // 将数据插入队列尾部 } } int dequeue() { if (front <= rear) { return queue[front++]; // 弹出队列头部元素 } } ``` 以上是C中常见的几种数据结构及其实现方式,当然还有其他类型的数据结构,如树、图等。在实际开发中,可以根据需求选择合适的数据结构来实现算法和数据处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值