二叉树-层序遍历的java实现

若给定的二叉树是{3,9,20,#,#,15,7},

    3↵   / ↵  9  20↵    /  ↵   15   7

则该二叉树层序遍历的结果是

[↵  [3],↵  [9,20],↵  [15,7]↵]

思考思路由于输出是从根节点开始依次向下,故不是采用递归思想,递归从底层 向上遍历输出。采用循环的方式,自顶向下依次读入树节点。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        ArrayList<ArrayList<Integer>> List1=new ArrayList<ArrayList<Integer>>();
        if(root==null)
            return List1;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()){
            int count=queue.size();
            ArrayList<Integer> list1=new ArrayList<Integer>();
            while(count>0){
                TreeNode temp=queue.poll();
                list1.add(temp.val);
                if(temp.left!=null)
                    queue.add(temp.left);
                if(temp.right!=null)
                    queue.add(temp.right);
                count--;
            }
            List1.add(list1);
        }
        return List1;
    }
}

用队列的方式,先进入队列的树节点先输出,再将自己的左右子节点加入队列,当前一次count归零时,表明这一层的节点都已遍历完, 则将此时的list1 add进List1,再进行下一层的处理。

其中注意的是:

1、queue结构的非空判断是用的 isEmpty()函数而非Stack的empty()函数;

2、queue定义时不能用ArrayList,应采用LinkedList,Stack是类,Queue是接口

3、  add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常
  remove   移除并返回队列头部的元素    如果队列为空,则抛出一个NoSuchElementException异常
  element  返回队列头部的元素             如果队列为空,则抛出一个NoSuchElementException异常
  offer       添加一个元素并返回true       如果队列已满,则返回false
  poll         移除并返问队列头部的元素    如果队列为空,则返回null
  peek       返回队列头部的元素             如果队列为空,则返回null
  put         添加一个元素                      如果队列满,则阻塞
  take        移除并返回队列头部的元素     如果队列为空,则阻塞

remove、element、offer 、poll、peek 其实是属于Queue接口。

发布了32 篇原创文章 · 获赞 1 · 访问量 362

猜你喜欢

转载自blog.csdn.net/zy854816286/article/details/104697276