转载自https://github.com/Snailclimb/JavaGuide(添加小部分笔记)感谢作者!
树是一种类似现实生活中的树的数据结构(倒置的树)
任何一颗非空树只有一个根节点
一棵树具有以下特点:
- 一棵树中的任何两个节点有且仅有唯一的一条路相通 (因为每个结点只会有一个父节点)
- 一棵树如果有n个节点,那么它一定恰好有n-1条边
- 一棵树不包括回路
下面是一颗二叉树
深度和高度是对应的;根节点所在层为1层常用概念
节点:树中每个元素都可以统称为节点
根节点:顶层节点,或者说没有父节点的节点。上图中A节点就是根节点
父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点。上图中的 B 节点是 D 节点、E 节点的父节点
兄弟节点:具有相同父节点的节点互称为兄弟节点。上图中 D 节点、E 节点的共同父节点是 B 节点,故 D 和 E 为兄弟节点。
叶子节点:没有子节点的节点。上图中的 D、F、H、I 都是叶子节点
节点的高度**(跟叶子节点有关,同一层不一定一样):该节点到叶子节点的最长路径所包含的边数。
节点的深度**(跟根节点有关,同一层是一样的):根节点到该节点的路径所包含的边数**
节点的层数:节点的深度+1
树的高度:根节点的高度
二叉树的分类#
- **二叉树(Binary tree)**是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构
- 二叉树的分支,通常被称为左子树或右子树,并且,二叉树的分支具有左右次序,不能随意颠倒
- 二叉树的第i层至多拥有2^(i-1) 个节点
深度为k的二叉树至多总共有 2^(k+1) -1 个节点 (深度为k,最多k + 1 层,最多为满二叉树的情况)
至少有2^(k) 个节点,即 深度为k-1的二叉树的最多的节点再加1
(关于节点的深度的定义国内争议比较多,我个人比较认可维基百科对 节点深度的定义open in new window)。
满二叉树#
一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是 满二叉树。也就是说,如果一个二叉树的层数为 K,且结点总数是(2^k) -1 ,则它就是 满二叉树。











无向图的邻接矩阵是一个对称矩阵,因为在无向图中,顶点i和顶点j有关系,则顶点j和顶点i必有关系
邻接矩阵存储的方式优点是简单直接(直接使用一个二维数组即可),并且在获取两个顶点之间的关系的时候也非常高效*直接获取指定位置的数组元素。但是这种存储方式的确定啊也比较明显即 比较浪费空间








