构造二叉树和层序遍历

 输入输出示例

1 5 6 8 4 2 3 4 8 
[[1], [5, 6], [8, 4, 2, 3], [4, 8]]

package interview;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;


class Main9 {
	public static class TreeNode {
		int val;
		TreeNode left;
		TreeNode right;

		TreeNode(int x) {
			val = x;
		}
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str = "";
		while ((str = br.readLine()) != null && !"".equals(str)) {
			String[] arr = str.split(" ");
			
            // 第一个节点为根节点
			TreeNode root = new TreeNode(Integer.parseInt(arr[0]));

			Queue<TreeNode> queue = new LinkedList<>();

			TreeNode cur = root; // 当前节点
			int num = 1;// 已经构造了的节点数
			int count = 0;// 二叉树,每构造一个左右子树,需要切换下一个父节点
			while (num < arr.length) {
				// ==2表示左右子树都构造了,切换节点,按层序来构造
				if (count == 2) {
					cur = queue.poll();
					count = 0;
				}
				
				if (cur.left == null && num < arr.length) {
                    // 构造左子树,并放入队列
					cur.left = new TreeNode(Integer.parseInt(arr[num++]));
					queue.offer(cur.left);
					
					count++;
				}
				
				if (cur.right == null && num < arr.length) {
                    // 构造右子树,并放入队列
					cur.right = new TreeNode(Integer.parseInt(arr[num++]));
					queue.offer(cur.right);
					
					count++;
				}
				
			}
			
			System.out.println(levelOrder(root));;
		}
	}

public static List<List<Integer>> levelOrder(TreeNode root) {
    	
    	// 保存最终输出的结构
    	List<List<Integer>> result = new ArrayList<List<Integer>>();
    	Queue<TreeNode> d = new LinkedList<TreeNode>();
    	
    	d.offer(root);
    	int num = 1;// num表示本层有几个节点,起始的根节点只有一个
    	while(d.size() != 0) {
    		
    		int count = num;// 本层有几个节点,就循环几次
    		num = 0;// 循环中来获取下一层的节点数
    		ArrayList<Integer> each = new ArrayList<>();// 每层的节点值,层序

            // 把各个节点的左右子树压入队列,等count循环完毕时,队列中只存在下一层的节点
    		for (int i = 0; i < count; i++) {
    			TreeNode poll = d.poll();
    			
    			if (poll.left != null) {
    				d.offer(poll.left);
    				num++;
    			}
    			
    			if (poll.right != null) {
    				d.offer(poll.right);
    				num++;
    			}
    			
    			each.add(poll.val);
    		}
    		
    		result.add(each);
    	}
    		
    	return result;
    }
}

认清自己的一天

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值