码迷,mamicode.com
首页 > 其他好文 > 详细

剑指offer(10)

时间:2020-06-06 00:48:42      阅读:64      评论:0      收藏:0      [点我收藏+]

标签:integer   queue   top   内容   顺序   root   rem   size   检查   

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

 

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

给两个序列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;

}

剑指offer(10)

标签:integer   queue   top   内容   顺序   root   rem   size   检查   

原文地址:https://www.cnblogs.com/cherry-BAIL/p/13053091.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!