以二叉树的深度与广度优先遍历為例最合适不过了!!!
它是树结构插入、删除、修改、查找和排序运算的前提是二叉树一切运算的基础和核心。
二叉树的遍历是指按照一定的次序访问树中所有结点并且每个结点只被访问一次的过程。通常有四种遍历方式:
深度优先:(前序、中序、后序)
树的深度優先遍历因为没有parent指针,所有非递归形式一定要借助栈;相反如果二叉树的节点有parent指针,那么就不需要栈了
先让根进栈。只要栈不為空就可以弹栈。每次弹出一个节点要把它的左右节点进栈(右节点先进栈,因为栈是先进后出的)
用途:拷贝树;计算前缀表达式
// 2、递归方法前序遍历(根-左-右) // 虽然递归遍历简单和好理解,但是面对海量数据的时候由于递归算法需要创建很多对象,需要占用大量内存使得空间复杂度极大,也容易造成堆栈的溢出因此递归算法面对海量数据时还是有非常致命的缺陷 // 2.1 非递归方法前序遍历(根-左-祐)
对于中序遍历来说,非递归的算法比递归算法的效率要高的多中序遍历算法的实现的过程如下:
(1)初始化栈,根结点进栈;
(2)若栈非空则栈顶结点的左孩子结点相继进栈,直到null(到叶子结点时)依次退栈并检测当前结点有无右孩子
(3)重复执行(2),直至栈为空
用途:BST(二叉搜索树)的中序遍历以非降序方式输出节点
// 3、递归方法中序遍历(左-根-右)
// 3.1 非递归方法中序遍历(左-根-右)
相当于前序遍历改变一下。由根-咗-右变为根-右-左再reverse一下,这里使用头插法避免reverse的操作,同时使用LinkedList避免ArrayList的自动扩容影响性能。
用途:删除树;计算后缀表达式
// 4、递归方法后序遍历(左-右-根)
// 4.1 非递归方法后序遍历(左-右-根)
无论是树还是图的广度优先遍历(BFS),都要使用先进先出的队列结构
- 队列不為空时,执行循环体
- b) 将tempnode的左右孩子入队(先左后右)队尾入队
- c) 出队(先进先出,满足层序遍历的要求)队头出队
二叉树的遍历时间复雜度,无论递归与否方式与否,都是O(n)这是因为每个算法都要遍历每个节点仅仅一次。
}