您的位置:首页 > 编程语言 > Java开发

java实现二叉树的层次遍历

2018-03-20 14:16 387 查看
昨天面试的时候遇到这个问题,由于太久没有接触算法和数据结构了,导致遗忘的比较彻底,当时记得使用队列的特性可以实现层次遍历的问题,但是自己写的时候却没有很好的利用队列的特性,当时的第一想法是递归,最后写着写着就因为找不到好的出口条件,以及各种分支判断,加上如果有兄弟子树,还要写如何处理这种情况等等,最后反正是写不下去了。

所以今天着重记录一下,如何正确的使用队列的特性去实现二叉树的层次遍历。当然这次的状况也很好的警示:一般情况下,不要使用递归,除非这个递归的出口以及内部条件及其容易做出判断。所以这种东西还是需要经验的积累。

接下来看如何正确实现吧。参考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);
}
}


最后放两张图,大致理解一下吧,我就不说了。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: