标签: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();
}
设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;
}
标签:integer queue top 内容 顺序 root rem size 检查
原文地址:https://www.cnblogs.com/cherry-BAIL/p/13053091.html