从二叉树的前中后序遍历,我们来说递归和快速排序,基础+进阶+高级

本文介绍了二叉树的概念,包括结点结构和递归定义,并详细阐述了前序、中序和后序遍历的原理及其实现。通过举例展示了具体的遍历结果,并提供了Java代码实现。此外,还探讨了遍历过程中节点的访问次数这一问题,强调了递归在理解二叉树遍历中的关键作用。
摘要由CSDN通过智能技术生成

二叉树

二叉树的定义

首先我们准备一颗二叉树:

我们需要定义一些术语,我们所使用的数据结构由结点组成,结点包含的链接可以为空也可以指向其他结点. 在二叉树中,每个结点只能有一个父节点(只有一个例外,也就是根节点,它没有父节点),而且每个结点只有两个链接, 分别指向自己的左子结点和右子结点.尽管链接指向的是结点,但我们可以将每个链接看做指向了另一颗二叉树, 而这棵树的根节点就是被指向的节点.因此,我们可以将二叉树定义为一个空链接 ,或者是一个有左右两个链接的结点,每个链接都指向一颗(独立的)二叉树。----《算法》第四版。

前中后序遍历(这是本篇文章的要讨论的核心问题之一,由前中后序遍历来讨论递归,然后再到荷兰国旗问题和快速排序) 结点代码:

 public class TreeNode {

         int data;
         TreeNode leftNode;
         TreeNode rightNode;

        public TreeNode(int data) {
            this.data = data;
        }

    }

二叉树:

   public class BinaryTree {

    TreeNode root;

    public BinaryTree(TreeNode root) {
        this.root = root;
    }

    /**
     * 前序遍历
     */
    public void frontShow(){

    }

    /**
     * 中序遍历
     */
    public void middleShow(){

    }
    /**
     * 后序遍历
     */
    public void afterShow(){

    }
}

虽然百度不招人喜欢,但是百度百科的一些词条编辑的还是不错的. 从二叉树的递归定义可知,一棵非空的二叉树由根结点及左、右子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:

(1) 访问结点本身(N), (2) 遍历该结点的左子树(L), (3) 遍历该结点的右子树(R)。

前序遍历: 根节点 左子树 右子树 中序遍历: 左子树 根节点 右子树 后序遍历: 左子树 右子树 根节点

其实组合的话是有六种的,但是讨论递归的话,前中后序就足够了.

我们现在来任意的给一颗二叉树,不用代码。我们来写出前中后序遍历的结果:

前序遍历: 3 8 5 2 6 1 7 中序遍历: 5 8 2 3 1 6 7 后序遍历: 5 2 8 1 7 6 3

前中后序遍历的进一步解释: 当我到达一个结点,先打印出来,再去访问其他子结点就是前序遍历 当我到达一个结点,不是先打印当前结点,而是接着访问该节点的左子节点,某个节点没有子节点(或者说子结点是null) 我就打印当前节点,这就是中序遍历

以前序遍历为例,我首先打印根节点,然后判断它的左子节点是否为空,如果非空,打印该节点,然后接着进行这样的操作,
翻译成代码就是这样的:

在BinaryTree中的代码:

 public void frontShow(){
    System.out.println(root.data);
    if (root.leftNode != null){
        root.leftNode.frontShow();
    }
    if (root.rightNode != null){
        root.rightNode.frontShow();
    }
}

结点中的代码也是这样的,

public void frontShow(){
        System.out.println(root.data);
        if (root.leftNode != null){
            root.leftNode.frontShow();
        }
        if (root.rightNode != null){
            root.rightNode.frontShow();
        }
}

中后序代码把打印顺序调整一下就可以了,其实这个很好理解,不是多么酷炫的事情. 以下一个问题在我个人看来才是值得值得思考的,就是程序在遍历二叉树的过程,每个节点经过了几次。 其实这个问题,也是十分简单,你按着程序走就可以了.

首先来到3,接着来到8,接着来到5,然后发现5的左右子节点都是空的,然后回到…

这里再介绍另一种在形式上略有不同的前序遍历方式:

public void frontShow(TreeNode root){
        if (root == null){
            return;
        }
        System.out.println(data);
        frontShow(root.leftNode);
        frontShow(root.rightNode);
    }

最后

以上全部分布式技术专题+面试解析+相关的手写和学习的笔记pdf

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

还有更多Java笔记分享如下:

面试解析+相关的手写和学习的笔记pdf

CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】

还有更多Java笔记分享如下:

image

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值