20200304
题目 :栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列{1,2,3,4,5}是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
思路 :新建一个栈,首先把压栈的元素按顺序压入,当栈顶元素和出栈的第一个元素相同时,将该压栈的元素弹出,出栈列表指针向后移动并继续判断;最后判断出栈列表指针是否指向出栈列表的末尾。
code
public boolean validateStackSequences(int[] pushed, int[] popped){
Stack<Integer> stack = new Stack<>();
int j = 0;
for(int elem : pushed){
stack.push(elem);
while(j < popped.length && !stack.isEmpty() && stack.peek == popped[j]){
stack.pop();
j++;
}
}
return j == popped.length;
}
题目 :从上到下打印二叉树
从上到下打印二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
思路 :层次遍历
code
class Solution{
public int[] levelOrder(TreeNode root){
ArrayList<Integer> list = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
if(root == null) return new int[]{};
queue.offer(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
list.add(node.val);
if(node.left != null) queue.offer(node.left);
if(node.right != null) queue.offer(node.right);
}
int[] res = new int[list.size()];
for(int i=0;i<list.size();i++){
res[i] = list.get(i);
}
return res;
}
}
题目 :从上到下打印二叉树||
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
code
class Solution{
public List<List<Integer>> levelOrder(TreeNode root){
List<List<Integer>> resList = new ArrayList<>();
if(root == null) return resList;
List<Integer> innerList = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
int size = queue.size();
for(int i = 0;i < size;i++){
TreeNode node = queue.poll();
innerList.add(node.val);
if(node.left != null){
queue.offer(node.left);
}
if(node.right != null){
queue.offer(node.right);
}
}
resList.add(new ArrayList<>(innerList));
innerList.clear();
}
return resList;
}
}