java实现二叉树的层次遍历

昨天面试的时候遇到这个问题,由于太久没有接触算法和数据结构了,导致遗忘的比较彻底,当时记得使用队列的特性可以实现层次遍历的问题,但是自己写的时候却没有很好的利用队列的特性,当时的第一想法是递归,最后写着写着就因为找不到好的出口条件,以及各种分支判断,加上如果有兄弟子树,还要写如何处理这种情况等等,最后反正是写不下去了。
所以今天着重记录一下,如何正确的使用队列的特性去实现二叉树的层次遍历。当然这次的状况也很好的警示:一般情况下,不要使用递归,除非这个递归的出口以及内部条件及其容易做出判断。所以这种东西还是需要经验的积累。

接下来看如何正确实现吧。参考blog

public class LevelOrder {
    public void levelIterator(BiTree root){
        if (root == null){
            return;
        }
        LinkedList<BiTree> queue = new LinkedList<BiTree>();
        BiTree current = null;
        queue.offer(root); // 根节点入队
        while (!queue.isEmpty()){ // 只要队列中有元素,就可以一直执行,非常巧妙的利用了队列的特性
            current = queue.poll(); // 出队队头元素
            System.out.print("-->" + current.data);
            // 左子树不为空,入队
            if (current.leftChild != null)
                queue.offer(current.leftChild);
            // 右子树不为空,入队
            if (current.rightChild != null)
                queue.offer(current.rightChild);

        }
    }

    public static void main(String[] args) {
        BiTree b1 = new BiTree();
        b1.setData(1);
        BiTree b2 = new BiTree();
        b2.setData(2);
        BiTree b3 = new BiTree();
        b3.setData(3);
        BiTree b4 = new BiTree();
        b4.setData(4);
        BiTree b5 = new BiTree();
        b5.setData(5);
        BiTree b6 = new BiTree();
        b6.setData(6);
        BiTree b7 = new BiTree();
        b7.setData(7);

        b1.setLeftChild(b2);
        b1.setRightChild(b3);
        b2.setLeftChild(b4);
        b2.setRightChild(b5);
        b3.setLeftChild(b6);
        b3.setRightChild(b7);

        LevelOrder order = new LevelOrder();
        order.levelIterator(b1);
    }
}

最后放两张图,大致理解一下吧,我就不说了。
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ybt_c_index/article/details/79625030