vlambda博客
学习文章列表

面试管:手写一个二叉树的前序遍历吧!


二叉树简介:

大家都知道,树是一种经常用到的数据结构,用来模拟具有树状结构性质的数据集合。 树里的每一个节点有一个值和包含所有子节点的列表。二叉树就是一种典型的树状结构,它是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”



前序遍历介绍:

首先我们了解一下什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。如下图:

前序遍历完后 获得的集合为:

FBADCEGIH



遍历过程:

首先获取根 F

然后访问 左子树 获取到 B

然后访问 左子树 获取到 A

A 没有子树

开始访问B 的右子树 获取到 D

然后访问D的左子树 获取到 C

C 没有子树

开始访问 D 的右子树 获取到E

E 没有子树

往回走,一直到F

开始访问 F 的右子树 获取到 G

G没有左子树

开始访问G的右子树 获取到 I

开始访问 I 的左子树 获取到 H

前序遍历完成

因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。



思路:

定义  traversal(root) 表示当前遍历到 root 节点的答案。按照定义,我们只要首先将 root 节点的值加入答案,然后递归调用 traversal(root.left) 来遍历 root 节点的左子树,最后递归调用  traversal(root.right) 来遍历 root 节点的右子树即可,递归终止的条件为碰到空节点。



代码:

public static void main(String[] args) { Solution solution = new Solution(); TreeNode t = new TreeNode(1, new TreeNode(null,null,null), new TreeNode(2, new TreeNode(3,null,null), null)); System.out.println(solution.traversal(t));}
//给你二叉树的根节点 root ,返回它节点值的 前序遍历。public List<Integer> traversal(TreeNode root) { //先创建一个List List<Integer> result = new ArrayList<>(); //如果root为空,证明是空的二叉树,那么就直接返回链表 if (root == null){ return result; } result.add(root.val); result.addAll(traversal(root.left)); result.addAll(traversal(root.right)); return result;}


二叉树的前序遍历还有两种更骚的操作,你知道是什么吗?





昔我往矣,杨柳依依

今我来思,雨雪霏霏

【白话译文】

回想当初出征时,杨柳依依随风吹;如今回来路途中,大雪纷纷满天飞