• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
长发不及肩
博客园    首页    新随笔    联系   管理    订阅  订阅
剑指offer(10)

本期 栈的压入、弹出序列 && 从上往下打印二叉树

 

##题目 栈的压入、弹出序列

给两个序列A和B,A是栈的压入顺序,检查B是否为该栈的弹出序列

例如,A = {1,3,6,2,5}

那么,B = {3,1,2,5,6}是弹出顺序;B = {6,1,3,2,5}不是弹出序列

解题:建一个栈,将序列A依次压栈,如果当前栈顶元素等于序列B,则弹出栈顶元素,如果下一个不等于序列B的下一个元素则继续压栈

public boolean stackOrder(int [] pushA, int [] popB){

  if(pushA.length != popB.length}  return false;

  Stack<Ingeter> temp = new Stack<Integer>;

  int len = pushA.length;

  int i = 0;

  int j = 0;

  for(i = 0; i < len; i++){

    temp.push(pushA[i]);

    while(!temp.empty() && temp.top == popB[j]){

      temp.pop();

      j++;

    }

  }

  return temp.empty();

}

#另外看到Github上面有一种解法,直接将pushA序列看作栈,模拟压栈和出栈操作:

  设push,top指针给序列pushA;设pop指针给popB

  如果top不是-1且top与pop所指的值相同,则模拟出栈top-- pop++

  如果top不是-1且top与pop所指的值不同,则模拟压栈top++ push++

  如果top==-1,说明栈内空,模拟压栈pushA【top++】 = pushA【push】

但是从这里看到,栈空时的操作是将top所指的位置赋值为push所指的值,改变了序列的内容。如果不需要保存序列内容,自然是本方法复杂度低(这种方法时间复杂度$O(n)$,空间复杂度$O(1)$)

 

#第三种方法,先用眼睛查找规律

push序列中有 x,y两个值,那么在pop序列中,x必须为y的前一个或者在y的后面

所以,我们将数值按一对儿进行依次比较,也能检查

 

##题目 从上往下打印二叉树

从上往下,从左往右,打印二叉树

这是考察树的层次遍历。层次遍历可以借助队列实现

先将根加入队列,访问根的左右孩子,然后遍历根的左右孩子(先左孩子后右孩子)

建两个队列,一个存放节点,一个存放值

public ArrayList<Integer> printTreeFromTopToBottom(TreeNode root){

  ArrayList<Integer> res = new ArrayList<>;

  if(root == null)  return res;

  Queue<TreeNode> queT = new LinkedList<TreeNode>;

  queT.add(root);

  while(queT.size() != 0){

    root = queT.remove();

    res.add(root.val);

    if(root.left != null)

      printTreeFromTopToBottom(root.left);

    if(root.right != null)

      printTreeFromTopToBottom(root.right);

  }

  return res;

}

posted on 2020-06-06 00:18  长发不及肩  阅读(112)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3