-
遍历是二叉树各种操作的基础,上一节给出的遍历算法是递归实现的,本节给出二叉树遍历的非递归实现,非递归实现需要使用前面讲到的数据结构——栈、队列来作为辅助空间。
- 先序遍历
- int preorder_traverse(bitree bt, int (*visit)(elemtype e))
- {
- sqstack s;
- bitree p;
- init_stack(&s);
- p = bt;
- while (p || !is_stack_empty(s)) {
- while (p) { /* 左结点依次进栈,向左走到尽头 */
- visit(p->data);
- push_stack(&s, p);
- p = p->lchild;
- }
- if (!is_stack_empty(s)) {
- pop_stack(&s, &p); /* 出栈 */
- p = p->rchild;
- }
- }
- return OK;
- }
- 中序遍历
- int inorder_traverse(bitree bt, int (*visit)(elemtype e))
- {
- sqstack s;
- bitree p;
- init_stack(&s);
- p = bt;
- while (p || !is_stack_empty(s)) {
- while (p) {
- push_stack(&s, p);
- p = p->lchild;
- }
- if (!is_stack_empty(s)) {
- pop_stack(&s, &p);
- visit(p->data);
- p = p->rchild;
- }
- }
- return OK;
- }
- 后序遍历
- int postorder_traverse(bitree bt, int (*visit)(elemtype e))
- {
- sqstack s;
- bitree p, q;
- init_stack(&s);
- p = bt;
- q = NULL;
- while (p || !is_stack_empty(s)) {
- while (p) {
- push_stack(&s, p);
- p = p->lchild;
- }
- if (!is_stack_empty(s)) {
- get_top(s, &p); /* 取栈顶元素 */
- if (!p->rchild || p->rchild == q) { /* 如果p没有右孩子,或右孩子已经访问过 */
- visit(p->data);
- q = p;
- p = NULL;
- --s.top;/* 退栈 */
- }
- else
- p = p->rchild;
- }
- }
- return OK;
- }
- 层次遍历
- int levelorder_traverse(bitree bt, int (*visit)(elemtype e))
- {
- sqqueue sq;
- bitree cur;
- init_queue(&sq);
- if (bt) {
- in_queue(&sq, bt);
- while (!is_queue_empty(sq)) {
- out_queue(&sq, &cur);
- visit(cur->data);
- if (cur->lchild)
- in_queue(&sq, cur->lchild);
- if (cur->rchild)
- in_queue(&sq, cur->rchild);
- }
- }
- return OK;
- }
- 总结
遍历二叉树算法基本操作是访问结点,不论按哪一种次序进行遍历,对含n个结点的二叉树时间复杂度都为O(n)。
相关文章
- 第4章第1节练习题1 二叉树的基本操作(递归实现)
- 第4章第1节练习题2 二叉树的基本操作(非递归实现)
- 第4章第1节练习题1 二叉树的基本操作(递归实现)
- 算法刷题-二叉树的锯齿形层序遍历、用栈实现队列_栈设计、买卖股票的最佳时机 IV
- 算法导论 习题10.4-5 二叉树的遍历(非递归,O(1)存储)
- [数据结构]二叉树的前中后序遍历(递归+迭代实现)
- python实现递归和非递归求两个数最大公约数、最小公倍数
- Java实现二叉树的深度优先遍历和广度优先遍历算法示例
- 二叉树的创建(先序)先序中序后序遍历(递归算法),求叶子结点个数,求树的高度,树中结点的个数,值为data的结点所在的层数
- C++ 不知树系列之二叉堆排序(递归和非递归实现上沉、下沉算法)