leetcode--binary-tree-level-order-traversal

33 篇文章 0 订阅
27 篇文章 0 订阅

题意: 给定一棵二叉树,返回节点value的层次遍历顺序(从左到右,按层显示)。
举例: 给定一颗二叉树{3,9,20,#,#,15,7}

     3
    /  \
   9   20
        /  \
      15   7

返回层测顺序遍历

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

题目中给定的节点结构为

public class TreeNode {
  int val;
  TreeNode left;
  TreeNode right;
  TreeNode(int x) { val = x; }
}

分析: 本题考察如何对二叉树做层次遍历,层次遍历和宽度优先遍历很像,也需要使用队列,只不过层次遍历需要使用两个队列。交替使用两个队列存放父亲节点和孩子节点,如一个队列Q1用来存父亲节点,节点出Q1时将左右孩子加到另一个队列Q2中,直到Q1为空;然后遍历Q2,Q1存放Q2中父亲节点的左右孩子。重复上述操作直到树遍历结束为止。

代码

public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
         if(root == null){
             return new ArrayList<>();
         }else{
             //层次遍历需要两个队列完成
             Queue<TreeNode> level1 = new LinkedList<>();       //第一个队列
             Queue<TreeNode> level2 = new LinkedList<>();       //第二个队列
             ArrayList<ArrayList<Integer>> result = new ArrayList<>();  //返回结果
             level1.add(root);                              //首先将第一个队列设置为根节点的值
             while(!level1.isEmpty() || !level2.isEmpty()){
                 ArrayList<Integer> temp1 = new ArrayList<>();  //存放每一层的int值
                 while(!level1.isEmpty()){
                     TreeNode present = level1.poll();      //取出队列中的值
                     temp1.add(present.val);
                     if(present.left != null){
                         level2.add(present.left);
                     }
                     if(present.right != null){
                         level2.add(present.right);
                     }
                 }
                 if(temp1.size() > 0){
                     result.add(temp1);
                 }
                 ArrayList<Integer> temp2 = new ArrayList<>();  //存放每一层的int值
                 while(!level2.isEmpty()){
                     TreeNode present = level2.poll();      //取出队列中的值
                     temp2.add(present.val);
                     if(present.left != null){
                         level1.add(present.left);
                     }
                     if(present.right != null){
                         level1.add(present.right);
                     }
                 }
                 if(temp2.size() > 0){
                     result.add(temp2);
                 }
             }
             return result;
         }
     }

源程序下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值