在数据结构中,树的定义:

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

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

根节点之外没有子节点的叫叶子节点

有孩子的叫父节点

由同一个父节点衍生出来的叫兄弟节点

根的最大层级树,被称为树的高度,下面的树高度为4

 

 

比较典型的树

二叉树

二叉,顾名思义,每个节点最多有两个子节点。

二叉树有许多特殊形式,每一种都有自己的作用,但是最主要的应用还是进行查找操作和维持相对顺序

 

 满二叉树

一个二叉树的所有非叶子节点都存在左右孩子节点,并且所有叶子节点都在同一层级上,那么这个树就是满二叉树。

 

每一个分支都是满的

 

完全二叉树

对一个有n个节点的二叉树,按层级顺序编号,则所有节点的编号从1到n。

如果这个树所有节点和同样深度的满二叉树的编号从1到n节点位置相同,则这个二叉树为完全二叉树

节点位置和对应的满二叉树完全相同如下:

 完全二叉树的条件没有满二叉树那么苛刻:

满二叉树要求所有分支都是满的,而完全二叉树只需要保证最后一个节点之前的节点是满的即可

 

二叉树的存储

二叉树是逻辑存储。

物理存储可用:

  • 链式存储
  • 数组

 链式存储是二叉树最直观的存储方式,每一个链表节点拥有data变量和左右节点指针

用数组存储树节点

按照二叉树的顺序填充,有空缺就空出来

这样可以方便的在数组中定位二叉树的孩子节点和父节点                                                                                                                                                                                                                                                                                                                                                                                                                              

假设父下标是parent,那么他的左子节点的下标就是2*parent+1,右子节点的下标就是2*parent+2

反过来假设一个做子节点的下标是leftChild,那么他的父节点下标就是(leftChild-1)/2

但是对于稀疏的二叉树来说,用数组表示浪费空间,二叉堆才适用于数组表示。

 

二叉查找树(binary search tree)

  • 如果左子树不为空,则左子树上所有节点的值均小于根节点的值
  • 如果右子树不为空,则右子树上所有节点的值均大于根节点值
  • 左右子树也都是二叉查找树

又叫二叉排序树

 

 

 

 

对于 一个节点分布相对均衡打的二叉查找树来说,如果节点总数是n,那么搜索节点的时间复杂度就是O(logn),和树的深度是一样的。

这种依靠比较大小来逐步查找的方式和二分查找算法非常相似。

会有某个分支过长问题

 怎么解决涉及二叉树的自平衡,二叉树自平衡的方式有多种,如红黑树、AVL树、树堆等。

 

二叉树的遍历

从节点之间位置关系上分4种:

  1. 前序遍历
  2. 中序遍历
  3. 后序遍历
  4. 层序遍历

从更宏观的角度来看,分2种:

  1. 深度优先遍历(前序遍历、中序遍历、后序遍历)      前中后指的是根节点
  2. 广度优先遍历(层序遍历)

深度优先遍历

前序遍历

根节点-》左子树-》右子树

 

中序遍历

左子树-》根节点-》右子树

 

后序遍历

左子树-》右子树-》根节点 

 

递归实现

待续。。。

栈实现

待续。。。

广度优先遍历

在各个方向一个接着一个连续的遍历

层序遍历

 

队列实现

待续。。。

 

二叉堆

待续。。。

 

posted on 2023-04-22 23:20  or追梦者  阅读(8)  评论(0编辑  收藏  举报