5.2二叉搜索树遍历(前序、中序、后序、层次、广度优先遍历)

前言:在上一节中,我们对树及其相关知识做了了解,对二叉搜索树做了基本的实现,下面我们继续完善我们的二叉搜索树。

对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们寻常所说的层次遍历,如图:

因为树的定义本身就是递归定义,所以对于前序、中序以及后序这三种遍历我们使用递归的方法实现,而对于广度优先遍历需要选择其他数据结构实现,本例中我们使用队列来实现广度优先遍历。

四种基本的遍历思想为:

前序遍历:根结点 ---> 左子树 ---> 右子树 中序遍历:左子树---> 根结点 ---> 右子树 后序遍历:左子树 ---> 右子树 ---> 根结点 层次遍历:从上到下,从左到右。

比如,以下二叉树的各种遍历:

前序遍历:5-3-2-4-6-8 中序遍历:2-3-4-5-6-8 后序遍历:2-4-3-8-6-5 层次遍历:5-3-6-2-4-8

一、前序遍历

依据上文提到的遍历思路:根结点 ---> 左子树 ---> 右子树,代码实现如下:

 //二分搜索树的前序遍历(前序遍历:根结点 ---> 左子树 ---> 右子树)
    public void preOrder() {
        preOrder(root);
    }

    //前序遍历以node为根的二分搜索树,递归算法
    private void preOrder(Node node) {
        if (node == null) {
            return;
        }
        System.out.println(node.e);
        preOrder(node.left);
        preOrder(node.right);
    }

二、中序遍历

依据上文提到的遍历思路:左子树 ---> 根结点 ---> 右子树,代码实现如下:

   //二分搜索树的中序遍历(中序遍历:左子树---> 根结点 ---> 右子树)
    public void inOrder() {
        inOrder(root);
    }

    //中序遍历以node为根的二分搜索树,递归算法
    private void inOrder(Node node) {
        if (node == null) {
            return;
        }
        inOrder(node.left);
        System.out.println(node.e);
        inOrder(node.right);
    }

三、后序遍历

依据上文提到的遍历思路:左子树 ---> 右子树 ---> 根结点,代码实现如下:

    //二分搜索树的后序遍历(后序遍历:左子树 ---> 右子树 ---> 根结点)
    public void postOrder() {
        postOrder(root);
    }

    //后序遍历以node为根的二分搜索树,递归算法
    private void postOrder(Node node) {
        if (node == null) {
            return;
        }
        postOrder(node.left);
        postOrder(node.right);
        System.out.println(node.e);
    }

四、层次遍历

对于层次遍历,我们基于队列来实现,思路如下: (1)先在队列中增加根结点 (2)对于随意其余任意节点,在其出队列的时候访问(假设左孩子和右孩子有不为空的情况,入队列) 代码实现如下:

//层次遍历--(基于队列实现)
    public void levelOrder() {

        Queue<Node> q = new LinkedList<>();
        q.add(root);

        while (!q.isEmpty()) {
            Node cur = q.remove();
            System.out.println(cur.e);
            if (cur.left != null) {
                q.add(cur.left);
            }
            if (cur.right!=null){
                q.add(cur.right);
            }
        }
    }

源代码地址 https://github.com/FelixBin/dataStructure/blob/master/src/BST/BST.java

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]从前序与中序遍历序列构造二叉树/从中序与后序遍历序列构造二叉树

根据二叉树的前序遍历和中序遍历( 中序和后序)结果生成二叉树 假设没有重复数字

16120
来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]二叉树的直径

https://leetcode-cn.com/problems/diameter-of-binary-tree/description/

13110
来自专栏Rude3Knife的后端开发专栏

【Leetcode】【python】Hamming Distance, Merge Two Binary Trees

两个整数的汉明距离是指其二进制不相等的位的个数。 给定两个整数x和y,计算汉明距离。 注意: 0 ≤ x, y < 2^31.

8820
来自专栏Rude3Knife的后端开发专栏

[Leetcode][链表]相关题目汇总/分析/总结

16230
来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]Convert Sorted Array to Binary Search Tree

二叉查找树(英语:Binary Search Tree),也称二叉搜索树、有序二叉树(英语:ordered binary tree),排序二叉树(英语:sort...

9120
来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]Binary Tree Maximum Path Sum/二叉树中的最大路径和

求一棵二叉树中最大的路径和。该路径可以是二叉树中某一节点到树中任意一个节点的所经过的路径,不允许重复经过一个节点,不必经过根节点。

15120
来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]Flatten Binary Tree to Linked List/二叉树展开为链表

把一棵二叉树变为链表(扁平化),也就是一棵所有节点要么没有子节点,要么只有右节点的二叉树。

9310
来自专栏程序生活

二叉树的遍历

15740
来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]Balanced Binary Tree/平衡二叉树

判断一颗二叉树是否是“高度”平衡的。 平衡二叉树的定义是二叉树的任意节点的两颗子树之间的高度差小于等于1。 这实际上是AVL树(维基百科)的定义。

13120
来自专栏Rude3Knife的后端开发专栏

[Leetcode][python]Populating Next Right Pointers in Each Node I and II/填充同一层的兄弟节点

为二叉树的节点都添加一个next指针,指向跟它在同一高度的右边的节点,如果右边没有节点,就指向None。

10120

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励