一、题目
1、给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
2、给定一个二叉树,返回它的 中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
3、给定一个二叉树,返回它的 后序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
二、代码
前序遍历
public class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//创建一个数组l存储数值
List<Integer> l = new ArrayList<>();
preorderTraversal(root, l);
return l;
}
private void preorderTraversal(TreeNode root, List<Integer> l) {
if (root == null) {
return;
}
//节点值存入数组
l.add(root.val);
preorderTraversal(root.left, l);
preorderTraversal(root.right, l);
}
}
中序遍历
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> l = new ArrayList<>();
inorderTraversal(root, l);
return l;
}
private void inorderTraversal(TreeNode root, List<Integer> l) {
if (root == null) {
return;
}
inorderTraversal(root.left, l);
l.add(root.val);
inorderTraversal(root.right, l);
}
}
后序遍历
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> l = new ArrayList<>();
inorderTraversal(root, l);
return l;
}
private void inorderTraversal(TreeNode root, List<Integer> l) {
if (root == null) {
return;
}
inorderTraversal(root.left, l);
inorderTraversal(root.right, l);
l.add(root.val);
}
}
三、总结
前序遍历 先遍历根节点-左子树-右子树
先访问根节点
如果左节点不为空,前序遍历左节点
如果右节点不为空,前序遍历右节点
中序遍历 先遍历左子树->根节点->右子树
如果是递归,则递归遍历左子树,访问根节点,递归遍历右子树
非递归过程即:先访问最左子树结点,再访问其父节点,再访问其兄弟
后序遍历 先遍历左子树->右子树->根节点
先判断是否空
然后进行递归,最后访问根节点
总的来说,用递归来进行遍历较简单。