Day02 递归 | 46. 全排列、226. 翻转二叉树
一、46. 全排列
题目
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例 1:输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:输入:nums = [0,1]
输出:[[0,1],[1,0]]
示例 3:输入:nums = [1]
输出:[[1]]
1、思路
pos 值就是树的深度,for 循环就是当前层所有可选的分支,recur 进入下一层,removeLast/used=false 就是退回到父节点。深度优先地遍历了一棵排列树,每片叶子就是一个答案。
2、代码
class Solution {List<List<Integer>> ans = new ArrayList();List<Integer> per = new ArrayList();boolean[] used;int n;public List<List<Integer>> permute(int[] nums) {n = nums.length;used = new boolean[n];recur(nums, 0);return ans;}public void recur(int[] nums, int pos) {if (pos == n) {ans.add(new ArrayList(per));return;}for (int i = 0; i < n; i++) {if (!used[i]) {per.add(nums[i]); // pos = 0 , 1, 2used[i] = true;recur(nums, pos + 1);per.removeLast();used[i] = false;}}}}
二、226. 翻转二叉树
题目
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:
输入:root = []
输出:[]
1、思路
“先 swap,再递归”——每个节点只管 swap 自己的左右,剩下的交给递归。
2、代码
/*** 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 TreeNode invertTree(TreeNode root) {if (root == null) {return null;}TreeNode temp = root.left;root.left = root.right;root.right = temp;invertTree(root.left);invertTree(root.right);return root;}
}
- 时间:O(n) 每个节点访问一次
- 空间:O(h) 递归栈,h 是树高