1.二叉树的中序遍历(左根右)
给定一个二叉树的根节点 root ,返回它的 中序 遍历。 输入:root = [1,null,2,3] 输出:[1,3,2]
class Solution {
List< Integer> vals = new ArrayList < Integer> ( ) ;
public List< Integer> inorderTraversal ( TreeNode root) {
if ( root == null) {
return vals;
}
if ( root. left != null) {
inorderTraversal ( root. left) ;
}
vals. add ( root. val) ;
if ( root. right != null) {
inorderTraversal ( root. right) ;
}
return vals;
}
}
2.对称二叉树
给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
class Solution {
public boolean isSymmetric ( TreeNode root) {
if ( root == null) {
return true ;
}
return cmp ( root. left, root. right) ;
}
private boolean cmp ( TreeNode node1, TreeNode node2) {
if ( node1 == null && node2 == null) {
return true ;
}
if ( node1 == null || node2 == null || node1. val != node2. val) {
return false ;
}
return cmp ( node1. left, node2. right) && cmp ( node1. right, node2. left) ;
}
}
3.二叉树的最大深度
递归
class Solution {
public int maxDepth ( TreeNode root) {
if ( root == null) {
return 0 ;
}
int left = maxDepth ( root. left) ;
int right = maxDepth ( root. right) ;
return Math. max ( left, right) + 1 ;
}
}
BFS
class Solution {
public int maxDepth ( TreeNode root) {
if ( root == null) {
return 0 ;
}
int level = 0 ;
Queue< TreeNode> queue = new LinkedList < TreeNode> ( ) ;
queue. add ( root) ;
while ( ! queue. isEmpty ( ) ) {
int size = queue. size ( ) ;
level++ ;
for ( int i = 0 ; i < size; i++ ) {
TreeNode node = queue. remove ( ) ;
if ( node. left != null) queue. add ( node. left) ;
if ( node. right != null) queue. add ( node. right) ;
}
}
return level;
}
}
DFS
class Solution {
int maxLevel = 0 ;
public int maxDepth ( TreeNode root) {
if ( root == null) {
return 0 ;
}
dfs ( root, 1 ) ;
return maxLevel;
}
public void dfs ( TreeNode root, int level) {
if ( root == null)
return ;
if ( level > maxLevel) maxLevel = level;
dfs ( root. left, level + 1 ) ;
dfs ( root. right, level + 1 ) ;
}
}
4.只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 输入: [4,1,2,1,2] 输出: 4
class Solution {
public int singleNumber ( int [ ] nums) {
return Arrays. stream ( nums) . reduce ( ( a, b) - > a^ b) . getAsInt ( ) ;
}
}
5.买股票的最佳时机
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 输入:[7,1,5,3,6,4] 输出:5
class Solution {
public int maxProfit ( int [ ] prices) {
if ( prices. length <= 1 )
return 0 ;
int min = prices[ 0 ] , max = 0 ;
for ( int i = 1 ; i < prices. length; i++ ) {
max = Math. max ( max, prices[ i] - min) ;
min = Math. min ( min, prices[ i] ) ;
}
return max;
}
}