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

二叉树简介:

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

 

 

前序遍历介绍:

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

 

 

 

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

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;
}

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

 

 

昔我往矣,杨柳依依

今我来思,雨雪霏霏

【白话译文】

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

posted @ 2021-07-12 16:53  博客小屋  阅读(128)  评论(0编辑  收藏  举报