21、栈的压入、弹出序列

  1. 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序
  2. 假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序
  3. 序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列
  4. (注意:这两个序列的长度是相等的)
  • 解法

    • 使用一个辅助栈模拟入栈,将每个元素依次入栈,入栈后判断栈顶元素是否和输出数组对应,相对应则栈pop
    • 依次操作输入数组的数,最后栈为空表示是符合条件的
      1. import java.util.ArrayList;
      2. import java.util.Stack;
      3. public class Solution {
      4. public boolean IsPopOrder(int [] pushA,int [] popA) {
      5. if(pushA.length == 0 || popA.length == 0 || pushA.length != popA.length){
      6. return false;
      7. }
      8. Stack<Integer> stack = new Stack<>();
      9. int j = 0;
      10. for(int i = 0; i<pushA.length; i++){
      11. stack.push(pushA[i]);
      12. while(!stack.isEmpty() && stack.peek() == popA[j]){
      13. stack.pop();
      14. j++;
      15. }
      16. }
      17. return stack.isEmpty();
      18. }
      19. }

      21、从上往下打印二叉树

      1. 从上往下打印出二叉树的每个节点,同层节点从左至右打印
  • 解法

    • 这就像是广度优先搜索,使用一个队列。首先将根节点入队,判断队列是否为null作为循环条件,取出队列头元素,判断根节点是否有左子节点,有则入队;判断根节点是否有右子节点,有则入队;保存根节点的值,直到队列为null
    • 此处使用一个ArrayList来表示队列
      1. import java.util.ArrayList;
      2. /**
      3. public class TreeNode {
      4. int val = 0;
      5. TreeNode left = null;
      6. TreeNode right = null;
      7. public TreeNode(int val) {
      8. this.val = val;
      9. }
      10. }
      11. */
      12. public class Solution {
      13. public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
      14. ArrayList<Integer> list = new ArrayList<>();
      15. ArrayList<TreeNode> queue = new ArrayList<>(); // 用一个ArrayList模拟队列
      16. if (root == null) {
      17. return list;
      18. }
      19. queue.add(root);
      20. while (queue.size() != 0) {
      21. TreeNode temp = queue.remove(0);
      22. if (temp.left != null){
      23. queue.add(temp.left);
      24. }
      25. if (temp.right != null) {
      26. queue.add(temp.right);
      27. }
      28. list.add(temp.val);
      29. }
      30. return list;
      31. }
      32. }

      22、二叉搜索树的后序遍历序列

      1. 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果
      2. 如果是则返回true,否则返回false
      3. 假设输入的数组的任意两个数字都互不相同。(ps:我们约定空树不是二叉搜素树)
  • 解法

    • 根据二叉排序树的性质:根节点大于左子树,小于右子树。后序遍历找到根节点(根据后序遍历性质最后一个节点为根节点),与根节点值进行判断,从前往后进行遍历,找到左子树与右子树分割点(第一个大于根节点节点值的节点)。假如右子树有小于根节点的节点,则表示不是后续遍历…

      1. public class Solution {
      2. public boolean VerifySquenceOfBST(int [] sequence) {
      3. if (sequence == null || sequence.length == 0){
      4. return false;
      5. }
      6. return isBST(sequence, 0, sequence.length - 1);
      7. }
      8. private boolean isBST(int[] seq, int start, int end){
      9. if (start >= end){
      10. return true;
      11. }
      12. int val = seq[end];
      13. int split = start;
      14. // 找到左子树,右子树分割的点,指向右子树的某一节点
      15. for (; split < end && seq[split] < val; split++);
      16. // 假如右子树节点值比根节点小,则不是后序遍历结果
      17. for (int i = split; i < end; i++){
      18. if (seq[i] < val){
      19. return false;
      20. }
      21. }
      22. // 递归判断左右子树
      23. return isBST(seq, start, split - 1) && isBST(seq, split, end - 1);
      24. }
      25. }

      22、二叉树中和为某一值的路径

      1. 输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。
      2. 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
  • 解法

    • 这….
      1. import java.util.ArrayList;
      2. /**
      3. public class TreeNode {
      4. int val = 0;
      5. TreeNode left = null;
      6. TreeNode right = null;
      7. public TreeNode(int val) {
      8. this.val = val;
      9. }
      10. }
      11. */
      12. public class Solution {
      13. private ArrayList<ArrayList<Integer>> result = new ArrayList<>();
      14. private ArrayList<Integer> list = new ArrayList<>();
      15. public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int target) {
      16. if (root == null){
      17. return result;
      18. }
      19. list.add(root.val);
      20. target = target - root.val;
      21. if (target == 0 && root.left == null && root.right == null){
      22. result.add(new ArrayList<Integer>(list));
      23. }
      24. // 分别对左右子树判断
      25. ArrayList<ArrayList<Integer>> result1 = FindPath(root.left, target);
      26. ArrayList<ArrayList<Integer>> result2 = FindPath(root.right, target);
      27. // 回溯到当前节点的父节点了,父节点要走另一条路径,所以要把list的当前节点值删了,给当前节点的兄弟节点腾位置
      28. list.remove(list.size() - 1);
      29. return result;
      30. }
      31. }