前言
二叉树的前序遍历,中序遍历,后序遍历是面试中常常考察的基本算法,关于它的概念这里不再赘述了,还不了解的同学可以去翻翻LeetCode的解释。
这里,我个人对这三个遍历顺序理解是:前中后这三个词是针对根节点的访问顺序而言的,即前序就是根节点在最前根->左->右,中序是根节点在中间左->根->右,后序是根节点在最后左->右->根。
无论哪种遍历顺序,用递归总是最容易实现的,也是最没有含金量的。但我们至少要保证能信手捏来地把递归写出来,在此基础上,再掌握非递归的方式。
在二叉树的顺序遍历中,常常会发生先遇到的节点到后面再访问的情况,这和先进后出的栈的结构很相似,因此在非递归的实现方法中,我们最常使用的数据结构就是栈。
前序遍历
前序遍历(题目见这里)是三种遍历顺序中最简单的一种,因为根节点是最先访问的,而我们在访问一个树的时候最先遇到的就是根节点。
递归法
递归的方法很容易实现,也很容易理解:我们先访问根节点,然后递归访问左子树,再递归访问右子树,即实现了根->左->右的访问顺序,因为使用的是递归方法,所以每一个子树都实现了这样的顺序。
class Solution { public ListpreorderTraversal(TreeNode root) { Listresult = new LinkedList