欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

荐 数据结构和算法5-非线性-树

程序员文章站 2022-06-26 17:58:03
数据结构和算法系列共八篇数据结构和算法1-介绍数据结构和算法2-线性-链数据结构和算法3-线性-栈数据结构和算法4-线性-队列数据结构和算法5-非线性-树数据结构和算法6-非线性-图数据结构和算法7-搜索数据结构和算法8-排序先介绍个工具数据结构在线动画工具1.概念1-1.什么是树树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个...

数据结构和算法系列共八篇

先介绍个工具

1.概念

1-1.什么是树

树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构。
没有结点的树称为空(null或empty)树。一棵非空的树包括一个根结点,还(很可能)有多个附加结点,所有结点构成一个多级分层结构。

荐
                                                        数据结构和算法5-非线性-树

1-2.度

度(degree)分为

  • 节点的度, 含有几个子节点(儿子)
  • degree为0的节点,称为叶子节点leaf
  • 最上层的曾为根节点root
  • degree不为0的节点,除根以外称为内部节点
  • 树的度,各节点的最大degree称为树的degree (m叉树)

荐
                                                        数据结构和算法5-非线性-树

1-3.深度

深度(depth)又叫层次(level),root为第一层,其子节点为第二层,子的子为第三层…以此类推

荐
                                                        数据结构和算法5-非线性-树

1-4.树的分类

顺序分

如果树的节点是有顺序的,那就是有序树,没有顺序的则是无序的

节点分

按树所有node里,某node的子node最多树为m,那就是m叉树 (以最多的为基准,即树的degree)

树的个数分

多棵树组成一个森林,一个树只是特殊的森林。

1-5.节点间关系

直接关系

  • 父节点:一个节点直接前节点
  • 子节点:一个节点直接后节点
  • 兄弟节点:同一父节点的,其他节点

间接关系

  • 祖先:从根到该节点所经分支上的所有节点;
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟

荐
                                                        数据结构和算法5-非线性-树

2.二叉树

二叉树,是m叉树为2的特殊树(即:树的degree小于等于2)。

2-1.二叉树特性

荐
                                                        数据结构和算法5-非线性-树

有兴趣的可以看下其证明

2-2.二叉树分类

2-2-1.满二叉树

高度为k并且有2k+112^{k+1}-1个结点的二叉树。

荐
                                                        数据结构和算法5-非线性-树

2-2-2.完全二叉树

基于满二叉树,在最下层从最右侧起去掉相邻的若干叶子结点,得到的二叉树称为完全二叉树。

荐
                                                        数据结构和算法5-非线性-树

2-3.二叉树的存储结构

  • 顺序数组存储
  • 链结构存储

2-3-1.顺序数组存储

如果是完全二叉树,用顺序存储很好。但是不是完全二叉树的话,中间会有空留,占用空间。

荐
                                                        数据结构和算法5-非线性-树

荐
                                                        数据结构和算法5-非线性-树

2-3-2.链结构存储

链表结构比较适合二叉树存储。node节点结构:左子节点、数据、右子节点

这样的数据结构,只能保证父找到子,不能保证子找父的。(如需子找到父,那还得需要多加个父节点存储)

荐
                                                        数据结构和算法5-非线性-树

3.遍历

二叉树遍历根据root的位置分三种

  • 前序遍历:根-左-右 DLR
  • 中序遍历:左-根-右 LDR
  • 后序遍历:左-右-根 LRD

荐
                                                        数据结构和算法5-非线性-树

3-1.前序遍历

心法口诀:首先访问根,再先序遍历左子树,最后先序遍历右子树

荐
                                                        数据结构和算法5-非线性-树

传统分析

1.找到root-1,然后左边子node-4,右边子node-1。得到1 4_ 2_
2.再分析左边的node-4,node-4的左子node没有,右子node为node-5。得到1 4 5 2_
3.左边没有,在分析右边node-2,node-2的左子node-3,右子node-6。得到1 4 5 2 3 6 _
4.再分析node-3的,左右子node都没有,是leaf
5.再分析node-6,左子node没有,右子node-7。得到1 4 5 2 3 6 7

个人技巧

荐
                                                        数据结构和算法5-非线性-树

注意上面箭头方向。从最左上,每次一层,所得的结果就是前序结果。

用咱的小技巧去试试前面的二叉树吧,看是不是得到一样的结果。

3-2.中序遍历

心法口诀:首先中序遍历左子树,再访问根,最后中序遍历右子树

荐
                                                        数据结构和算法5-非线性-树

传统分析

1.找到root-1放中间,然后左边子node-4放左侧,右边子node-1放右侧。得到_4_ 1 2_(此时下划线是4和2的)
2.再分析左边的node-4,node-4的左子node没有,右子node为node-5。得到4 5 1 _2_(此时下划线是2的)
3.左边没有,在分析右边node-2,node-2的左子node-3放左侧,右子node-6放右测。得到4 5 1 _3_2_6_(此时下划线是3和6的)
4.再分析node-3的,左右子node都没有,是leaf。4 5 1 3 2_6_(3没有左右,那么就将3的左右下划线删去)
5.再分析node-6,左子node没有,右子node-7放右测。得到4 5 1 3 2 6 7

个人技巧

荐
                                                        数据结构和算法5-非线性-树

因为根在中间,那不就是跟我们二叉树一样吗!!!(左根右,LDR),所以直接把二叉树压平到一条线,不就是需要的顺序吗? 是不是so easy