面试管:手写一个二叉树的前序遍历吧!
二叉树简介:
大家都知道,树是一种经常用到的数据结构,用来模拟具有树状结构性质的数据集合。 树里的每一个节点有一个值和包含所有子节点的列表。二叉树就是一种典型的树状结构,它是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”
前序遍历介绍:
首先我们了解一下什么是二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。如下图:
前序遍历完后 获得的集合为:
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;
}
二叉树的前序遍历还有两种更骚的操作,你知道是什么吗?
昔我往矣,杨柳依依
今我来思,雨雪霏霏
【白话译文】
回想当初出征时,杨柳依依随风吹;如今回来路途中,大雪纷纷满天飞