美文网首页
二叉树的遍历算法

二叉树的遍历算法

作者: 学习编程好少年 | 来源:发表于2019-03-08 19:33 被阅读0次

递归版本

先序遍历:

void preorder (BTNode *p) {
    if (p != NULL) {
        Visit(p);
        preorder(p->lchild);
        preorder(p->rchild);
    }
}

中序遍历:

void inorder (BTNode *p) {
    if (p != NULL) {
        preorder(p->lchild);
        Visit(p);
        preorder(p->rchild);
    }
}

后序遍历:

void postorder (BTNode *p) {
    if (p != NULL) {
        preorder(p->lchild);
        Visit(p);
        preorder(p->rchild);
    }
}

非递归版本

先序遍历:

void preoderNonrecursion (BTNode *bt) {
    if (bt != NULL) {
        BTNode *Stack [maxSize];
        int top = -1;
        BTNode *p = NULL;
        Stack[++top] = bt;

        while (top != -1) {
            p = Stack[top--];
            Visit(p);
            if (p.rchild != NULL) { //由于栈先进后出的特性,右子树先进栈
                Stack[++top] = p->rchild;
            }
            if (p->lchild != NULL) {
                Stack[++top] = p-lchild;
            }
        }
    }
}

中序遍历:

void inorderNonrecursion (BTNode *bt) {
    if (bt != NULL) {
        BTNode *Stack[maxSize];
        int top = -1;
        BTNode *p = bt;
        
        while (top != -1 || p != NULL) {
            while (p != NULL) {
                Stack[++top] = p;
                p = p->lchild;
            }
            if(top != -1) {
                p = Stack[top--];
                Visit(p);
                p = p->rchild;
            }
        }
    }
}

后序遍历:

//逆后续遍历序列是先序遍历对左右子树遍历顺序交换的结果。
//即先求先序遍历对左右子树遍历顺序交换的序列,再将该序列逆序即可得到后续遍历序列
void postorderNonrecursion (BTNode *bt) {
    if (bt != NULL) {
        BTNode *Stack1[maxSize], *Stack2[maxSize];
        int top1 = -1, top2 = -1;
        BTNode *p = NULL;
        Stack1[++top1] = bt;
        while (top1 != -1) {
            p = Stack1[top1--];
            Stack2[++top2] = p;
            //注意下面两个if语句的进栈顺序与先序遍历的区别,左右孩子的入栈顺序相反
            if (p->lchild != NULL) {
                Stack1[++top1] = p->lchild;
            }
            if (p->rchild != NULL) {
                Stack1[++top1] = p->rchild;
            }
        }
        while (top2 != -1) {
            //出栈序列即为后序遍历序列
            p = Stack2[top2--];
            Visit(p);
        }
    }
}

层次遍历:

void level (BTNode *p) {
    if (p != NULL) {
        int front = 0, rear = 0;
        BTNode *que[maxSize];
        BTNode *q = NULL;
        
        rear = (rear + 1) % maxSize;
        que[rear] = p;
        while (front != rear) {
            front = (front + 1) % maxSize;
            q = que[front];
            Visit(q);
            if (q->lchild != NULL) {
                rear = (rear + 1) % maxSize;
                que[rear] = q->lchild;
            }
            if (q->rchild != NULL) {
                rear = (rear + 1) % maxSize;
                que[rear] = q->rchild;
            }
        }
    }
}

相关文章

  • 算法-二叉树算法总结

    二叉树算法总结 1 二叉树的遍历 1.1 前序遍历 递归 迭代 1.2 中序遍历 递归 迭代 1.3 后序遍历 递...

  • ALI 算法

    二叉树遍历算法: 按层遍历, 中序前序后序:

  • 二叉树的遍历

    二叉树的遍历 二叉树常用的遍历方式有:前序遍历、中序遍历、后序遍历、层序遍历四种遍历方式,不同的遍历算法,其思想略...

  • 二叉树的中序遍历(Java)——Morris迭代算法

    二叉树的中序遍历 对于此题而言,若采用递归算法(简单),我们使用深度优先算法来遍历二叉树。若采用迭代算法,我们使用...

  • 二叉树遍历(递归算法和非递归算法)

    实验三 二叉树遍历(递归算法和非递归算法) 一.实验目的 1.掌握二叉树的存储结构与基本操作 2.掌握二叉树的遍历...

  • 二叉树的遍历

    数据结构算法 二叉树的遍历

  • 翻转二叉树(Java)

    翻转二叉树 对于此题而言,我们使用深度优先算法来遍历二叉树。 1、深度优先算法是根据二叉树的路径进行遍历2、广度优...

  • 深入浅出二叉树遍历的非递归算法 2019-11-15(未经允许,

    1、二叉树遍历的递归算法 递归实现二叉树的遍历非常直观,回顾一下递归的代码: 前序遍历 中序遍历 后序遍历 他们的...

  • 二叉树遍历算法

    摘要:二叉树主要有3种遍历算法,分为为先序、中序、后序。本文对二叉树的3种遍历算法的遍历规则进行介绍,并给出3种遍...

  • Leetcode 144 二叉树的前序遍历

    二叉树的前序遍历 题目 给定一个二叉树,返回它的 前序 遍历。 示例: 进阶: 递归算法很简单,你可以通过迭代算法...

网友评论

      本文标题:二叉树的遍历算法

      本文链接:https://www.haomeiwen.com/subject/ccedpqtx.html