递归
-
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。
-
确定终止条件:操作系统是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。
-
确定单层递归的逻辑。
前序遍历
1. 确定递归函数的参数和返回值
把树和用于存放前序的list作为参数。递归函数不需要返回值,因为我们把要求的都放入list里面,由主函数输出。
2. 终止条件
当前遍历的节点是空了,那么本层递归就要要结束了,所以如果当前遍历的这个节点是空,就直接return
3. 单层逻辑
- 先输出当前节点(传入的是树的头节点)
- 判断左子节点是否为空,不为空则递归继续前序遍历
- 判断右子节点是否为空,不为空则递归继续前序遍历
/**
* 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<Integer> result = new ArrayList<>();
preorder(root,result);
return result;
}
public void preorder(TreeNode root, List result){
//终止条件写在前
if(root==null){ return;}
//先存中间的
result.add(root.val);
//左边节点
preorder(root.left,result);
//右边节点
preorder(root.right,result);
}
}
中序,后序
简单变一下逻辑:
//中序
public void midorder(TreeNode root, List result){
//终止条件写在前
if(root==null){ return;}
//左边节点
midorder(root.left,result);
//存中间的
result.add(root.val);
//右边节点
midorder(root.right,result);
}
//后序
public void postorder(TreeNode root, List<Integer> list) {
if (root == null) {
return;
}
postorder(root.left, list);
postorder(root.right, list);
list.add(root.val); // 注意这一句
}