二叉树的前序遍历是先根节点,然后左节点,最后右节点,
递归遍历时,递归终止条件是当前节点为空,
当前节点不为空时,先把当前节点的值存入到list中,
然后先去遍历左子树,再遍历右子树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
//定义保存遍历结果的list
ArrayList list = new ArrayList();
//调用下面的可以传入node和list参数的私有方法
return preorder(root,list);
}
//定义一个私有方法,前序遍历以node为根节点的二叉树,
//并将结果保存到传进来的list中
private List<Integer> preorder(TreeNode node, List list) {
//递归终止条件
//如果节点为空,就不需要继续遍历,也不需要保存值
//返回list即可
if(node == null)
return list;
//如果当前节点不为空
else {
//先将当前节点的值保存到list中
list.add(node.val);
//以当前节点的左节点为根节点进行前序遍历,
//结果仍然保存在list中
preorder(node.left,list);
//左子树遍历完以后,以当前节点的右节点为根节点进行遍历
preorder(node.right, list);
}
return list;
}
}
二叉树的后序遍历是先左节点,然后右节点,最后根节点,
递归遍历时,递归终止条件是当前节点为空,
当前节点不为空时,先去遍历左子树,再遍历右子树,
最后把当前节点的值存入到list中。
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList list = new ArrayList();
return postorder(root,list);
}
private List<Integer> postorder(TreeNode node, List list) {
if(node == null)
return list;
else {
postorder(node.left,list);
postorder(node.right, list);
//只有这一行代码换了位置,最后添加当前节点的val值
list.add(node.val);
}
return list;
}
}
二叉树的中序遍历是先左节点,然后根节点,最后右节点,
递归遍历时,递归终止条件是当前节点为空,
当前节点不为空时,先去遍历左子树,
然后把当前节点的值存入到list中,
最后再遍历右子树。
相对于上面的代码,只需要把
list.add(node.val);
移到两句递归语句中间的位置即可。