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

栈的压入、弹出序列

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

解题思路

以一个辅助栈出栈和第二个序列的作对比。判断栈顶元素是不是弹出序列的开始,如果是栈弹出,弹出序列的指针往后推一个再比较。如果栈顶元素与弹出序列所指元素相等再重复,否则入栈。
在这里插入图片描述

代码

/**
 * 剑指offer一刷:栈的压入、弹出序列
 *
 * @author User
 * @create 2019-05-20-12:30
 */

public class jzo21 {
    public boolean IsPopOrder(int [] pushA,int [] popA) {
        if (pushA==null||popA==null){
            return false;
        }
        int index=0;      //表示输出数组的索引
        Stack<Integer> sta=new Stack<>();
        for (int i=0;i<pushA.length;i++){
            sta.push(pushA[i]);
            while (!sta.isEmpty()&&sta.peek()==popA[index]){
                sta.pop();
                index++;
            }
        }
        return sta.empty();
    }
    public static void main(String[] args){
        int[] pusha={1,2,3,4,5};
        int[] popa={4,5,3,2,1};
        jzo21 so=new jzo21();
        System.out.println(so.IsPopOrder(pusha,popa));
    }
}

从上往下打印二叉树

从上往下打印出二叉树的每个节点,同层节点从左至右打印。

解题思路

从上到下打印二叉树就是层序遍历,先打印根结点,再打印左右结点(第二层),再打印左右结点的左右结点(第三层)。
在这里插入图片描述

代码

/**
 * 剑指offer一刷:从上往下打印二叉树(层次打印)
 *
 * @author User
 * @create 2019-05-20-12:30
 */

public class jzo22 {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> newTree=new ArrayList<>();
        if(root==null){
            return newTree;
        }
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);     //进队
        while (!queue.isEmpty()){
//            int size=queue.size();
//            ArrayList<Integer> level=new ArrayList<>();
//            for (int i=0;i<size;i++){
                TreeNode node=queue.poll();    //出队
                newTree.add(node.val);
                if (node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
        }
//            newTree.add(level);
//        }
        return newTree;
    }
    public static void main(String[] args){
        TreeNode node1=new TreeNode(1);
        TreeNode node2=new TreeNode(2);
        TreeNode node3=new TreeNode(3);
        TreeNode node4=new TreeNode(4);
        TreeNode node5=new TreeNode(5);
        TreeNode node6=new TreeNode(6);
        TreeNode node7=new TreeNode(7);
        TreeNode node8=new TreeNode(8);
        TreeNode node9=new TreeNode(9);
        node1.left=node2;
        node1.right=node3;
        node2.left=node4;
        node3.left=node5;
        node3.right=node6;
        node5.left=node7;
        node5.right=node8;
        node6.right=node9;
        jzo22 so=new jzo22();
        System.out.println(so.PrintFromTopToBottom(node1));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值