二叉树的几种遍历

Posted Cool Coding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的几种遍历相关的知识,希望对你有一定的参考价值。

从业五年了,为什么突然要写一篇很基础的文章。

曾经思考过一个问题,为什么算法是程序猿的灵魂,因为太多太多的程序猿包括我在内,自从大学毕业之后很少接触算法的东西了。毕竟不是每个人都在BATJ,大部分的人应该都还在硬啃业务,吃透业务,用代码实现业务逻辑。久而久之已然忘记了大学时候那些数据结构。

冒泡排序,快速排序很多人都是用已经封装好的工具方法,真要让人手动写一个,估计没几个程序猿在没准备的情况下写出来吧。辗转相除法求最大公约数,我想大部分人就知道有这么一个东西,可能连具体的算法都想不起来了吧。

所以呢,写一篇这类基础的文章,帮助我也帮助有需要的人回忆起大学里那些曾经学过的数据结构。(和算法结合起来一起看更香哟)

看个图,这就是二叉树。

就是一个很简单的东西数据结构。

二叉搜索树就要求左子节点比根节点值小,右子节点比根节点值大,普通的二叉树则没有这个要求。

我们先定义我们的树节点的数据结构如下:

public class TreeNode {

public int val;
public TreeNode left;
public TreeNode right;

public TreeNode(int x) {
val = x;
}
}

先序遍历

所谓先序遍历,就是先访问根节点的值,再访问它的左子节点,再访问它的右子节点。使用递归

public void scan(TreeNode root){
if(root != null){
System.out.println(root.val);
scan(root.left);
scan(root.right);
}
}

中序遍历

所谓中序遍历,就是先访问根节点的左子节点,再访问根节点的值,最后访问根节点的右子节点。使用递归

public void scan(TreeNode root){
if(root != null){
scan(root.left);
System.out.println(root.val);
scan(root.right);
}
}

后序遍历

所谓后序遍历,就是先访问根节点的左子节点,再访问根节点的右子节点,最后访问根节点的值。使用递归

public void scan(TreeNode root){
if(root != null){
scan(root.left);
scan(root.right);
System.out.println(root.val);
}
}

至于他们的非递归实现留给读者回忆啦,这种有助于加深自己的印象哟。

层次遍历

层次遍历也是一个比较常用的遍历方式,即从根节点开始,一层层的往下遍历。层次遍历是迭代遍历,借助于队列来实现。

public void scan(TreeNode root){
BlockingQueue<TreeNode> queue = new LinkedBlockingQueue<>();
//根节点入队列
queue.add(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
System.out.println(node);
//左子节点入队列
queue.add(node.left);
//右子节点入队列
queue.add(node.right);
}
}

到这里二叉树的几种常见的遍历方式我们就回忆的差不多了,在LeetCode的题目里,也是根据这几种遍历方式稍作改动就可以解决很多问题,以我目前的感觉来说,遇到二叉树的题目基本用递归来解决。

下期我们接着分享和回忆其他的数据结构。

The    end

Cool Coding

喜欢就关注我,和我一起玩吧~


以上是关于二叉树的几种遍历的主要内容,如果未能解决你的问题,请参考以下文章

两种方法实现二叉树的层序遍历

二叉树的遍历

算法基础:二叉树的遍历

Python教程讲解二叉树的三种深度

488,二叉树的Morris中序和前序遍历

数据结构-二叉树的存储结构与遍历