树形数据结构是一种非线性的数据结构,把它叫做树,是因为这种数据结构的形态很像一颗倒着的树。树和链表类似,通过节点来存放数据,用不同的方法来表示树,节点的域也会有所不同。
![](https://i-blog.csdnimg.cn/blog_migrate/d2c81be752d7c891e2d13078dda3f5d6.png)
树有很多基本的属性和性质,这里先介绍一些常用的:
·根节点:树起始的第一个节点,根节点没有父亲节点。
·子节点:一个节点向下分出的节点称为该节点的子节点,例如节点b就是节点a的子节点。
·父亲节点:分出子节点的节点,称为这个子节点的父亲节点,a就是b的父亲节点。
·节点的度:每一个节点分出来的子节点的个数叫做这个节点的度,如图,c节点的度为2,b节点的度为1。
·边:节点向下生成的分支个数叫边,列如b生成了一条边,a生成了两条边,树中边的总数为节点总数减一。
·树的度:树的度就是这个树中度最多的节点的度。
·节点的层次:根节点所在的层次为第一层,根节点的子节点所在为第二层,依次类推。
·树的高度:树中层次最大的节点的层数就是树的高度。
·叶子节点:没有子节点的节点称为叶子节点,如图节点d、e、f。
·兄弟节点:同属一个父亲节点的节点互相称为兄弟节点,例如b和c、e和f互为兄弟节点。
树由根节点分散出若干子节点,每一个子节点又可以分散出它的子节点。树的每一个节点除了与它的父亲节点相连之外,不会再与其他的节点相连,否则就不叫树。
![](https://i-blog.csdnimg.cn/blog_migrate/9ce40b6ed941af2add7e20fe7809f739.png)
二叉树是一种特殊的树形结构,普通的树,每一个节点都可以分出若干个子节点,0个、1个、或者7个、8个。而二叉树每一个节点分出的子节点只能有三种情况:0、1、2。
二叉树中又有两种特殊的情况:满二叉树和完全二叉树。满二叉树指的是二叉树中每一层都必须放满。完全二叉树指每一次分出子节点,都必须是从左往右依次分出。
![](https://i-blog.csdnimg.cn/blog_migrate/7748d9278aa2b3b6e55b15245142d299.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8d595c7a9f814fe0f810f2de7ce63893.png)
任意一个二叉树,都可以由边数S等于节点数N减1和二叉树的节点总数等于度为0的节点数n0加上度为1的节点数n1加上度为2的节点数n2,推导出n0 = n2 + 1,即叶子节点数为度为2节点数加1。
![](https://i-blog.csdnimg.cn/blog_migrate/b531111e103ef6a8d27dd94d4b996107.png)
在满二叉树中,因为每一层都必须放满,通过等比数列求和能很容易的得到,有K层的满二叉树,其节点总数就为2^K - 1。这样就可以反推出n个节点的满二叉树的层数K = log2(n+1);完全二叉树同样可以用这个公式来推出n个节点的完全二叉树的层数,但是需要对结果进行向上取整。
因为完全二叉树是由上而下、从左到右依次分出子节点,所以当我们将根节点编号为0,然后向下依次给子节点编号,那么第i个节点的父节点的编号就是(i - 1) / 2。第i个节点的左子节点编号就是2*i + 1右子节点编号为2*i + 2。