LeetCode—Level Order

本文介绍了一种使用队列实现二叉树层次遍历的方法,并提供了详细的Java代码实现。通过队列记录每一层的节点,实现了按层输出二叉树节点的功能。

Qustion:
层次遍历二叉树。
Given binary tree [3,9,20,15,7null,null],
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
Idea:
采用队列,但是根据其返回形式,需要打印每一层,如何判断该层结束是需要考虑的。其实层次遍历实现是通过队列,首先将根入队,只要队不为空时,每次出队一个,如果出队的节点有左右子节点就入队,此时入队的左右子节点即是下一层的对象。所以可以利用一个新的队列2来存放。当队列1为空时,说明该层遍历完,则存入List中,把队列2赋值给队列1再进行循环。其实是两层循环。
因为是用java写的,java中的Queue不太会用,就自己写了队列类

public List<List<Integer>> levelOrder(TreeNode root) {
    Queue  queue = new Queue(1024);
    List<List<Integer>> list = new ArrayList<List<Integer>>();
    if(root==null){
    return list;
    }

    queue.push(root);
    //每层节点集
    List<Integer> level = new ArrayList<Integer>();
    do{
        Queue  queue2 = new Queue(1024);
        while(!queue.isEmpty()){
            //取对头节点
            TreeNode head = queue.peek();
            level.add(head.val);

            //弹出队头
            queue.pop();

            if(head.left!=null){
                queue2.push(head.left);
            }
            if(head.right!=null){
                queue2.push(head.right);
            }
        }
        list.add(level);
        level = new ArrayList<Integer>();
        queue = queue2;
    }while(!queue.isEmpty());

    return list; 
}

public class Queue {
    /**
     * 实现队列
     */
    int first,last,maxSize;
    TreeNode[] queue;
    public Queue(int size){
        first = last = -1;
        maxSize = size;
        queue = new TreeNode[maxSize];
    }
    public boolean isEmpty(){
        if(first==-1){
            return true;
        }else {
            return false;
        }
    }
    public boolean isFull(){
        if(first==(last+1)%maxSize){
            return true;
        }else {
            return false;
        }
    }
    //push
    public boolean push(TreeNode num){
        if(this.isFull()){
            System.out.println("queue is full!");
            return false;
        }if(this.isEmpty()){
            first = last = 0;
        }else{
            last = (last+1)%maxSize;
        }
        queue[last] = num;

        return true;
    }

    public TreeNode pop(){
        TreeNode num = queue[first];
        if(this.isEmpty()){
            queue = new TreeNode[maxSize];
            return null;
        }
        if(first==last){
            //到达队尾,清空数组
            queue = new TreeNode[maxSize];
            first = last = -1;
            return num;
        }

        first=(first+1)%maxSize;
        return num; 
    }

    public TreeNode peek(){
        if(first==-1) return null;
        else return queue[first];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值