1、栈的压入、弹出序列
1.1 题目描述:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
1.2 题解
1.2.1
初始化: 辅助栈 stackstack ,弹出序列的索引 ii ; 遍历压栈序列: 各元素记为 numnum ; 元素 numnum入栈; 循环出栈:
若 stackstack 的栈顶元素 == 弹出序列元素 popped[i]popped[i] ,则执行出栈与 i++i++ ;
返回值: 若 stackstack 为空,则此弹出序列合法。
public boolean validateStackSequences(int[] pushed, int[] popped) {
Stack<Integer> stack = new Stack<>();
int i = 0;
for(int num : pushed) {
stack.push(num); // num 入栈
while(!stack.isEmpty() && stack.peek() == popped[i]) { // 循环判断与出栈
stack.pop();
i++;
}
}
return stack.isEmpty();
}
2、从上到下打印二叉树
2.1 题目描述:
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
2.2 题解
2.2.1 层次遍历算法(BFS)
特例处理: 当树的根节点为空,则直接返回空列表 [] ;
初始化: 打印结果列表 res = [] ,包含根节点的队列 queue =[root] ;
BFS 循环: 当队列 queue 为空时跳出;
出队: 队首元素出队,记为 node;
打印: 将 node.val 添加至列表 tmp 尾部;
添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入队列 queue ;
返回值:返回打印结果列表 res 即可
public int[] levelOrder(TreeNode root) {
if(root == null) return new int[0];
Queue<TreeNode> queue = new LinkedList<>(){{ add(root); }};
ArrayList<Integer> ans = new ArrayList<>();
while(!queue.isEmpty()) {
TreeNode node = queue.poll();
ans.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
int[] res = new int[ans.size()];
for(int i = 0; i < ans.size(); i++)
res[i] = ans.get(i);
return res;
}
3、从上到下打印二叉树 II
3.1 题目描述:
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
3.2 题解
3.2.1
解法如上题
public List<List<Integer>> levelOrder(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList<>();
if(root != null) queue.add(root);
while(!queue.isEmpty()) {
List<Integer> tmp = new ArrayList<>();
for(int i = queue.size(); i > 0; i--) {
TreeNode node = queue.poll();
tmp.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
res.add(tmp);
}
return res;
}
4、从上到下打印二叉树 III
4.1 题目描述:
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
4.2 题解
4.2.1
增加一个判断,判断是从左还是从右
public List<List<Integer>> levelOrder(TreeNode root) {
if(root == null) return new ArrayList<>(0);
Queue<TreeNode> queue=new LinkedList<>(){{add(root);}};
List<List<Integer>> res =new ArrayList<>();
boolean flag=false;
while(!queue.isEmpty()){
LinkedList<Integer> list = new LinkedList<>();
for(int i=queue.size();i>0;i--){
TreeNode node =queue.poll();
if (flag)
list.addFirst(node.val);
else
list.addLast(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
res.add(list);
flag=!flag;
}
return res;
}