树是一种特殊的数据类型,模拟具有树状结构 的 数的集合
《【树的特点】》:
每个节点都有零个或多个子节点;
没有父节点的节点为根节点;
每一个非根节点有且只有一个父节点;
除了根节点外,每个子节点可以分为多个不想交的子树
树的术语:
【节点的度】:某个节点所分出的下一级子节点的个数
【树的度】:所有节点中,最大的节点的度即为数的度
【叶子节点/终端节点】:度为0的节点
【兄弟节点】:拥有相同的父节点的节点
【节点的层次】:从根节点开始算起,记为第一层,根节点的子节点为第二层,依次类推
【树的高度或深度】:书中节点的最大层次
【堂兄弟节点】:节点的父节点在同一层的节点互称堂兄弟节点
【节点的祖先】:从根节点到该节点的一条路径上的所有直系节点
【《树的种类》】:
无序树(自由树):节点之间没有任何顺序关系(自己指定的)
有序树:节点之间有顺序关系
有序树又可分为【二叉树】 【霍夫曼树】 【B树】
二叉树:节点的度最高为2,即一个节点的子节点最多两个,分为完全二叉树 满二叉树 平衡二叉树 排序二叉树
【完全二叉树】:除了最高层外,其它层都应该达到最大的度
【满二叉树】:所有的层都要达到最大数量
【平衡二叉树】:当且仅当节点的任意两个子树的深度差不大于1
【排序二叉树】:见下图类似
树的存储
存放的时候是一种链式存储,
自根节点开始存储,自上而下,一行一行的存,父节点中会存放子节点的位置,
节点类似于链表,同时又存在差异,链表只有一个后继链接,而树每个节点有两个及以上的链接
二叉树
子树通常称为“左子树” 和 “右子树”
二叉树的性质:
【】在第i层,最多有in-1个节点
【】深度为k的二叉树,最多有 2k-1个节点
【】如果二叉树的叶子节点数为N1,度数为2的节点数为N2,则N1=N2+1
【】具有n个节点的完全二叉树的深度为log2(n+1)
广度优先遍历(层次遍历):一层一层从左到右遍历,
完全二叉树用代码实现的过程是一个从前部取出元素进行操作(查看是否有子树,两个子树则向后,不满则追加),而在最后的位置进行追加元素
**深度遍历**的方式:先序遍历(先根节点 左节点 右节点) 中序遍历(先左子节点\根节点\右节点) 后序遍历(做节点 右节点\根节点)
0 1 3 7 8 4 9 2 5 6
7 3 8 1 9 4 0 5 2 6
7 8 3 9 4 1 5 6 2 0
17:27分钟
根据遍历出的数字的顺序,来画出一棵树
要求,给的顺序中,必须包含中序的,在加上任意一个另外的顺序就可以画出一棵树。因为中序遍历情况下,根节点能够将左右节点分来成两部分,
先序:0 1 3 7 8 4 9 2 5 6
中序:7 3 8 1 9 4 0 5 2 6
先序给出根节点是0,在中序中找到0的位置,可知,0左边【738194】的是0的左子树,而右边的【526】是右子树,多次重复这样的过程,即可确定一棵树
后序:7 8 3 9 4 1 5 6 2 0
中序:7 3 8 1 9 4 0 5 2 6
后序给出的最后一个数字0是整棵树的根节点,同样中序中的0左边的数字是左子树的数字,右边是右子树的数字
先序:0 1 3 7 8 4 9 2 5 6
后序:7 8 3 9 4 1 5 6 2 0
而如果没有中序遍历结果,此时无法树分成左右两部分,