树
树
在数据结构中,树的定义:
树是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种:
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
从更宏观的角度来看,分2种:
- 深度优先遍历(前序遍历、中序遍历、后序遍历) 前中后指的是根节点
- 广度优先遍历(层序遍历)
深度优先遍历
前序遍历
根节点-》左子树-》右子树
中序遍历
左子树-》根节点-》右子树
后序遍历
左子树-》右子树-》根节点
递归实现
待续。。。
栈实现
待续。。。
广度优先遍历
在各个方向一个接着一个连续的遍历
层序遍历
队列实现
待续。。。
二叉堆
待续。。。
作者: deity-night
出处: https://www.cnblogs.com/deity-night/
关于作者:码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(***@163.com)咨询.