递归三部曲(时刻牢记)
1.确认递归函数需要的参数与返回值
一般为传入一个根节点 传入一个数组用来存放结果数组
2.确定终止条件
3.确定单层递归逻辑
递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以这就是递归为什么可以返回上一层位置的原因。
迭代用栈完成
二叉树的定义
java
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;
}
}
144. 二叉树的前序遍历 (根左右)
递归
java
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
preorder(root,result);
return result;
}
public void preorder(TreeNode root,List<Integer> result){
if(root == null){
return;
}
result.add(root.val);
preorder(root.left,result);
preorder(root.right,result);
}
}
迭代( 迭代用栈 前序遍历 中左右 进栈顺序 中右左)
java
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
result.add(node.val);
if(node.right != null){
stack.push(node.right);
}
if(node.left != null){
stack.push(node.left);
}
}
return result;
}
}
145. 二叉树的后序遍历 (左右根)
递归
java
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
postorder(root,result);
return result;
}
private void postorder(TreeNode root,List<Integer> result){
if(root == null){
return;
}
postorder(root.left,result);
postorder(root.right,result);
result.add(root.val);
}
}
迭代
前序遍历根左右 总是先出根结果 进栈顺序 根 右 左 出栈 根 左 右
后序遍历左右根 进栈顺序 根 左 右 出栈 根 右 左 再反转结果集 左右根
java
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
if(node.left != null){
stack.push(node.left);
}
if(node.right != null){
stack.push(node.right);
}
result.add(node.val);
}
Collections.reverse(result);
return result;
}
}
94. 二叉树的中序遍历 (左根右)
递归
java
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
inorder(root,result);
return result;
}
public void inorder(TreeNode root,List<Integer> result){
if(root == null){
return;
}
inorder(root.left,result);
result.add(root.val);
inorder(root.right,result);
}
}
迭代( 中序遍历 左 根 右 一直遍历到最左子节点 弹出 每次弹出先添加右节点)
java
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(cur != null || !stack.isEmpty()){
if(cur != null){
stack.push(cur);
cur = cur.left;
}else{
TreeNode node = stack.pop();
result.add(node.val);
cur = node.right;
}
}
return result;
}
}